递归矩阵乘法-多线程算法

程序算法艺术与实践:递归策略之矩阵乘法问题 矩阵(Matrix)是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。并且在ACM竞赛,有很多涉及到矩阵知识的题。许多算法都会结合矩阵来处理,而比较具有代表性的矩阵算法有:矩阵快速幂、高斯消元等等.关于程序算法艺术与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea. 阅读详情
package com.data.struct;

import java.util.concurrent.CountDownLatch;

public class MultiThreadRecuisiveMatrixMultipy {
	static int[][] a = new int[][] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 },
			{ 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
	static int[][] b = new int[][] { { 1, 3, 5, 7 }, { 2, 4, 6, 8 },
			{ 11, 13, 15, 17 }, { 12, 14, 16, 18 } };
	static int[][] c = new int[a.length][a.length];

	private static int[][] recruciveMultipy(int [][]a,int[][]b,int[][] indexA,int[][]indexB,int size,CountDownLatch cdl){
		int [][] c=new int[size][size];
		if(indexA[0][0]-indexA[3][0]==0){
			c[indexA[0][0]][indexB[0][1]]=a[indexA[0][0]][indexA[0][1]]*b[indexB[0][0]][indexB[0][1]];
			//System.out.println(indexA[0][0]+":"+indexB[0][1]+"="+c[indexA[0][0]][indexB[0][1]]);
		}else{
			int n=size;
			int[][] indexA11=new int[4][2];
			indexA11[0][0]=indexA[0][0];
			indexA11[0][1]=indexA[0][1];
			indexA11[1][0]=indexA[1][0];
			indexA11[1][1]=(indexA[1][1]+indexA[0][1])/2;
			indexA11[2][0]=(indexA[2][0]+indexA[0][0])/2;
			indexA11[2][1]=indexA[2][1];
			indexA11[3][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA11[3][1]=(indexA[3][1]+indexA[0][1])/2;
			
			int [][]indexA12=new int[4][2];
			indexA12[0][0]=indexA[0][0];
			indexA12[0][1]=(indexA[1][1]+indexA[0][1])/2+1;
			indexA12[1][0]=indexA[1][0];
			indexA12[1][1]=indexA[1][1];
			indexA12[2][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA12[2][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA12[3][0]=(indexA[3][0]+indexA[0][0])/2;
			indexA12[3][1]=indexA[3][1];
			
			int [][] indexA21=new int[4][2];
			indexA21[0][0]=(indexA[2][0]+indexA[0][0])/2+1;
			indexA21[0][1]=indexA[0][1];
			indexA21[1][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA21[1][1]=(indexA[3][1]+indexA[0][0])/2;
			indexA21[2][0]=indexA[2][0];
			indexA21[2][1]=indexA[2][1];
			indexA21[3][0]=indexA[3][0];
			indexA21[3][1]=(indexA[3][1]+indexA[0][0])/2;
			
			int[][]indexA22=new int[4][2];
			indexA22[0][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA22[0][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA22[1][0]=(indexA[3][0]+indexA[0][0])/2+1;
			indexA22[1][1]=indexA[3][1];
			indexA22[2][0]=indexA[3][0];
			indexA22[2][1]=(indexA[3][1]+indexA[0][1])/2+1;
			indexA22[3][0]=indexA[3][0];
			indexA22[3][1]=indexA[3][1];
			
			int[][]indexB11=new int[4][2];
			indexB11[0][0]=indexB[0][0];
			indexB11[0][1]=indexB[0][1];
			indexB11[1][0]=indexB[1][0];
			indexB11[1][1]=(indexB[1][1]+indexB[0][1])/2;
			indexB11[2][0]=(indexB[2][0]+indexB[0][0])/2;
			indexB11[2][1]=indexB[2][1];
			indexB11[3][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB11[3][1]=(indexB[3][1]+indexB[0][1])/2;
			
			int[][]indexB12=new int[4][2];
			indexB12[0][0]=indexB[0][0];
			indexB12[0][1]=(indexB[1][1]+indexB[0][1])/2+1;
			indexB12[1][0]=indexB[1][0];
			indexB12[1][1]=indexB[1][1];
			indexB12[2][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB12[2][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB12[3][0]=(indexB[3][0]+indexB[0][0])/2;
			indexB12[3][1]=indexB[3][1];
			
			int[][]indexB21=new int[4][2];
			indexB21[0][0]=(indexB[2][0]+indexB[0][0])/2+1;
			indexB21[0][1]=indexB[0][1];
			indexB21[1][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB21[1][1]=(indexB[3][1]+indexB[0][0])/2;
			indexB21[2][0]=indexB[2][0];
			indexB21[2][1]=indexB[2][1];
			indexB21[3][0]=indexB[3][0];
			indexB21[3][1]=(indexB[3][1]+indexB[0][0])/2;
			
			int[][]indexB22=new int[4][2];
			indexB22[0][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB22[0][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB22[1][0]=(indexB[3][0]+indexB[0][0])/2+1;
			indexB22[1][1]=indexB[3][1];
			indexB22[2][0]=indexB[3][0];
			indexB22[2][1]=(indexB[3][1]+indexB[0][1])/2+1;
			indexB22[3][0]=indexB[3][0];
			indexB22[3][1]=indexB[3][1];
			
			RecruciveMultipyThread t1=new RecruciveMultipyThread(a,b,indexA11,indexB11,size,cdl);
			t1.start();
			RecruciveMultipyThread t2=new RecruciveMultipyThread(a,b,indexA12,indexB21,size,cdl);
			t2.start();
			
			RecruciveMultipyThread t3=new RecruciveMultipyThread(a,b,indexA11,indexB12,size,cdl);
			t3.start();
			RecruciveMultipyThread t4=new RecruciveMultipyThread(a,b,indexA12,indexB22,size,cdl);
			t4.start();
			
			RecruciveMultipyThread t5=new RecruciveMultipyThread(a,b,indexA21,indexB11,size,cdl);
			t5.start();
			RecruciveMultipyThread t6=new RecruciveMultipyThread(a,b,indexA22,indexB21,size,cdl);
			t6.start();
			
			RecruciveMultipyThread t7=new RecruciveMultipyThread(a,b,indexA21,indexB12,size,cdl);
			t7.start();
			RecruciveMultipyThread t8=new RecruciveMultipyThread(a,b,indexA22,indexB22,size,cdl);
			t8.start();
			
			try {
				cdl.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			int [][]c11x=t1.getC();
			int [][]c11y=t2.getC();
			int[][]c12x=t3.getC();
			int[][]c12y=t4.getC();
			int[][]c21x=t5.getC();
			int[][]c21y=t6.getC();
			int[][]c22x=t7.getC();
			int[][]c22y=t8.getC();
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c11x[i][j]+c11y[i][j];
				}
			}
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c12x[i][j]+c12y[i][j];
				}
			}
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c21x[i][j]+c21y[i][j];
				}
			}
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c[i][j]+=c22x[i][j]+c22y[i][j];
				}
			}
		}
		
		return c;
	}
	
	private static class RecruciveMultipyThread extends Thread{
		private int[][]a;
		private int[][]b;
		private int[][]indexA;
		private int[][]indexB;
		private int size;
		private int[][]c;
		private CountDownLatch cdl;
		public RecruciveMultipyThread(int[][]a,int[][]b,int [][]indexA,int[][] indexB,int size,CountDownLatch cdl){
			this.a=a;
			this.b=b;
			this.indexA=indexA;
			this.indexB=indexB;
			this.size=size;
			this.cdl=cdl;
		}
		@Override
		public void run() {
			CountDownLatch cdl2=new CountDownLatch(8);
			c=recruciveMultipy(a,b,indexA,indexB,size,cdl2);
			cdl.countDown();
		}
		public int[][] getC() {
			return c;
		}
		
		
	}
	public static void printC(){
		for(int i=0;i<c.length;i++){
			for(int j=0;j<c[i].length;j++){
				System.out.print(c[i][j]+" ");
			}
			System.out.println();
		}
	}
	public static void main(String[] args) {
		CountDownLatch cdl=new CountDownLatch(8);
		c=recruciveMultipy(a,b,new int[][]{
				{0,0},
				{0,a.length-1},
				{a.length-1,0},
				{a.length-1,a.length-1}
		},new int[][]{
				{0,0},
				{0,a.length-1},
				{a.length-1,0},
				{a.length-1,a.length-1}
		},a.length,cdl);
		try {
			cdl.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		printC();
	}

}

矩阵乘法优化:从高斯消元到Strassen与Winograd算法 在计算机科学中,乘法操作因其硬件实现复杂和高精度计算下的平方级时间复杂度,常被视为性能瓶颈。为了提升计算效率,减少乘法次数成为算法优化的核心课题。其原理在于通过数学变换和预处理,用廉价的加法或内存访问替代昂贵的乘法,从而降低整体计算复杂度。这一思想在高斯消元法中体现为通过行缩放避免重复除法计算;在Strassen算法中,则通过递归分治将矩阵乘法的复杂度从O(n³)降至O(n^2.807),实现了用加法换乘法的突破;而Winograd算法进一步优化了加法次数,提升了数值稳定性。这些技术在高性能计算、深度学习( 阅读详情

相关推荐

26、多线程算法缓存缺失分析的再探讨

本文深入探讨了多线程算法中的缓存缺失问题,重点分析了8路递归矩阵乘法、深度-n矩阵乘法和快速傅里叶变换(FFT)等典型算法在并行执行过程中的缓存行为。引入了HBP(分层分治并行)和BP计算模型,结合工作窃取调度机制,提出了基于自然任务和变量访问约束的缓存缺失边界分析方法。通过引理与定理的形式化推导,给出了不同算法在发生S次窃取时的缓存缺失上界,并特别针对FFT算法得出了包含顺序复杂度、窃取开销和数据局部性影响的综合表达式。研究还表明,在一定条件下FFT可实现接近线性的最优加速,为多线程算法的性能优化提供了理

hill8的博客 32

矩阵乘法递归求解

给定两个N×N的矩阵,求乘积 如下图所示,乘法执行过程如下: 1.矩阵1先拿出一行,矩阵2先拿出一列 2.行与列相乘得到value1 3.行与剩下矩阵2相乘得到value2(递归过程) 4.剩下矩阵1与列相乘得到value3(递归过程) 5.剩下矩阵1与剩下矩阵2相乘得到value4(递归过程) 6.将value1~value4合并成结果数组 写代码时注意约定,val...

weixin_30652491的博客 818

高效矩阵乘法算法设计与优化实战

矩阵乘法的故事远未结束。我们已经看到:- 数学突破(Strassen)- 并行革命(OpenMP/CUDA)- 硬件加速(SIMD/FMA/Tensor Core)- 框架智能(XLA/Inductor)下一步会是什么?可能是稀疏化 + 动态剪枝,让无效计算彻底消失;也可能是量子矩阵乘法,虽然现在还像科幻小说;更有可能是AI 自动生成最优内核,就像 AlphaTensor 那样。但无论如何,这场关于效率的战争永远不会停止。

weixin_31938351的博客 776

分享矩阵乘法单线程与多线程的Java实现与效率对比,请教Strassen算法

分享矩阵乘法单线程与多线程的Java实现与效率对比,请教Strassen算法 矩阵乘法的多线程实现: /**     * @Title: MultiThreadMatrix.java  * @Package matrix  * @Description: 多线程计算矩阵乘法  * @author Aloong  * @date 2010-10-28 下午09:45:5

Aaaa007007的专栏 2220

java多线程技术实现矩阵乘法计算

这个资源仅供参考!希望大家提提意见!希望大家支持支持!也我从别的地方找来的!

矩阵乘法的多线程算法

实现矩阵乘法的多线程算法 public class WorkerThread 工mplements Runnable private 工nt row; pr 工vate int col; private int [] [] A; private int [] [] B; private int [] [] C;

多线程计算矩阵乘法性能测试

多线程计算矩阵乘法性能测试 目录: 1.手工方法计算乘法矩阵 1.1任意的 m**n 阶矩阵A和nk阶矩阵B核心代码(附件1) 1.2任意的两个m阶矩阵乘法用于测试代码运行效率(附件2) 2.分治法计算乘法矩阵 2.1普通递归分治法计算矩阵乘法(附件3) 2.2Strasses法计算矩阵乘法(附件4) 3.多线程(进程)计算乘法矩阵 3.1利用python自带的threadingpool库函数的线程池方法(附件5) 3.2利用python的多进程multiprocessing库函数实现矩阵乘法计算(...

weixin_44457451的博客 1744

矩阵乘法的strassen算法(C++实现)

一般情况下矩阵乘法需要三个for循环,时间复杂度为O(n^3),现在我们将矩阵分块如图:( 来自MIT算法导论 ) 一般算法需要八次乘法 r = a * e + b * g ; s = a * f + b * h ; t = c * e + d * g; u = c * f + d * h; strassen将其变成7次乘法,因为大家都知道乘法比加减法消耗更多,所有时间复杂更高! strassen的处理是: 令: p1 = a * ( f - h ) p2 = ( a + b ) * h p3 = ( c +d ) * e p4 = d * ( g - e ) p5 = ( a + d ) * ( e + h ) p6 = ( b - d ) * ( g + h ) p7 = ( a - c ) * ( e + f ) 那么我们可以知道: r = p5 + p4 + p6 - p2 s = p1 + p2 t = p3 + p4 u = p5 + p1 - p3 - p7

基于矩阵分块乘法的多线程(并行)矩阵乘法的实现

并行矩阵乘法的实现

naturerun的博客 301

多线程矩阵乘法C++源代码

多线程矩阵乘法的VC++源代码,使用Windows API实现多线程。是学习多线程的入门示例

可并行递归算法的递归多线程实现

关于如何实现在递归中实现多线程

Erlang实现的矩阵相乘C=A*B单线程与并行多线程性能对比

-module(new). -export([]). -compile(export_all). %% ==================================================================== %% Internal functions %% =================================================

zcc_0015的专栏 1754

斐波那契数列求解(矩阵相乘、直接累加)

分别采用矩阵相乘法(分治递归)和直接累加求和的方法求解第n个斐波那契数

Strassen Parallel Iterative

"2DArray2.h":----------------------------------------------------------------------------------------------------------------------------------#include #include //OR #define NULL ((void *)0)temp

tiandyoin的专栏 645

数据中心GPU芯片性能参数速查表(Nvidia+国产算力卡)

本文提供了一份数据中心GPU芯片性能参数速查表,涵盖Nvidia与国产算力卡两大阵营。文章详细解读了算力、显存、互连技术及功耗等关键性能指标,并对比了A100、H100、昇腾910B等主流型号,旨在帮助用户根据AI训练、推理等实际场景,做出高效的硬件选型与成本评估决策。

a0b1c2d3的专栏 837

扫地机的CPU只要二十多块?2024第二拆来了

昨天还说到这个机器人的故障,经小鱼拆机后测试和后台网友留言确认,不是防跌落问题,是轮子故障,这个轮子不会动,轮子上有一个限位开关检测机器人是否离开地面的,测试的时候也没有误触发,所以电机存在故障,后面拆电机的时候再检查。最后再留下一个疑问,这个机器人的回充没有用红外管,机器人是如何识别基站进行返回充电的(因为只买了本体,没买充电桩,不确定充电桩的形状,是不是利用点云识别不确定)懂的请留言。全志的R16,封装是 BGA282,那这个板子至少是4层板,小鱼盲猜 6 层板,知道的小伙伴欢迎留言。

生活不止眼前的苟且 1981

矩阵乘法(暴力,并行加速,stressen,并行加速stressen)

openMP 矩阵乘法 stressen矩阵乘法 openMP加速stressen矩阵乘法 openMP加速普通矩阵乘法

weixin_56273009的博客 3062

RimWorld Mod开发避坑指南:从Defs命名规范到XML结构详解(附实战代码)

本文深入解析RimWorld Mod开发中Defs文件的编写规范与高级技巧,涵盖命名冲突预防、XML结构优化及高级功能实现。通过实战代码示例,帮助开发者避开常见陷阱,提升Mod兼容性与稳定性,特别适合RimWorld Mod开发者参考。

weixin_30790841的博客 451

linux多线程编写矩阵乘法,算法导论学习——分治矩阵乘法

算法导论学习——分治矩阵乘法头文件 结构的定义stdafx.h// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include "targetver.h"#include #include // TODO: 在此处引用程序需要的其他头文件#include using namespace std;#defi...

weixin_26891599的博客 412

用VFP计算 CRC-16 Modbus 校验位

1. Modbus是一种串行通信协议,最初由Modicon(目前属于施耐德电气公司)于1979年开发2. Modbus协议是应用在Modicon产品上的,后来才被移植到其他产品上3. Modbus协议的通信接口可以有多种选择,如RS232、RS485、以太网等。

lddnzx的博客 519

常学常新:《Attention Is All You Need》万字解读!

常学常新:《Attention Is All You Need》万字解读!

hunteritself的博客 3651
上一篇: 普通矩阵乘法-多线程算法
下一篇: 合并排序-多线程算法
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值