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();
}
}
相关推荐
26、多线程算法缓存缺失分析的再探讨
本文深入探讨了多线程算法中的缓存缺失问题,重点分析了8路递归矩阵乘法、深度-n矩阵乘法和快速傅里叶变换(FFT)等典型算法在并行执行过程中的缓存行为。引入了HBP(分层分治并行)和BP计算模型,结合工作窃取调度机制,提出了基于自然任务和变量访问约束的缓存缺失边界分析方法。通过引理与定理的形式化推导,给出了不同算法在发生S次窃取时的缓存缺失上界,并特别针对FFT算法得出了包含顺序复杂度、窃取开销和数据局部性影响的综合表达式。研究还表明,在一定条件下FFT可实现接近线性的最优加速,为多线程算法的性能优化提供了理
矩阵乘法递归求解
给定两个N×N的矩阵,求乘积 如下图所示,乘法执行过程如下: 1.矩阵1先拿出一行,矩阵2先拿出一列 2.行与列相乘得到value1 3.行与剩下矩阵2相乘得到value2(递归过程) 4.剩下矩阵1与列相乘得到value3(递归过程) 5.剩下矩阵1与剩下矩阵2相乘得到value4(递归过程) 6.将value1~value4合并成结果数组 写代码时注意约定,val...
高效矩阵乘法算法设计与优化实战
矩阵乘法的故事远未结束。我们已经看到:- 数学突破(Strassen)- 并行革命(OpenMP/CUDA)- 硬件加速(SIMD/FMA/Tensor Core)- 框架智能(XLA/Inductor)下一步会是什么?可能是稀疏化 + 动态剪枝,让无效计算彻底消失;也可能是量子矩阵乘法,虽然现在还像科幻小说;更有可能是AI 自动生成最优内核,就像 AlphaTensor 那样。但无论如何,这场关于效率的战争永远不会停止。
分享矩阵乘法单线程与多线程的Java实现与效率对比,请教Strassen算法
分享矩阵乘法单线程与多线程的Java实现与效率对比,请教Strassen算法 矩阵乘法的多线程实现: /** * @Title: MultiThreadMatrix.java * @Package matrix * @Description: 多线程计算矩阵乘法 * @author Aloong * @date 2010-10-28 下午09:45:5
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库函数实现矩阵乘法计算(...
矩阵乘法的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
基于矩阵分块乘法的多线程(并行)矩阵乘法的实现
并行矩阵乘法的实现
多线程矩阵乘法C++源代码
多线程矩阵乘法的VC++源代码,使用Windows API实现多线程。是学习多线程的入门示例
可并行递归算法的递归多线程实现
关于如何实现在递归中实现多线程
Erlang实现的矩阵相乘C=A*B单线程与并行多线程性能对比
-module(new). -export([]). -compile(export_all). %% ==================================================================== %% Internal functions %% =================================================
斐波那契数列求解(矩阵相乘、直接累加)
分别采用矩阵相乘法(分治递归)和直接累加求和的方法求解第n个斐波那契数
Strassen Parallel Iterative
"2DArray2.h":----------------------------------------------------------------------------------------------------------------------------------#include #include //OR #define NULL ((void *)0)temp
数据中心GPU芯片性能参数速查表(Nvidia+国产算力卡)
本文提供了一份数据中心GPU芯片性能参数速查表,涵盖Nvidia与国产算力卡两大阵营。文章详细解读了算力、显存、互连技术及功耗等关键性能指标,并对比了A100、H100、昇腾910B等主流型号,旨在帮助用户根据AI训练、推理等实际场景,做出高效的硬件选型与成本评估决策。
扫地机的CPU只要二十多块?2024第二拆来了
昨天还说到这个机器人的故障,经小鱼拆机后测试和后台网友留言确认,不是防跌落问题,是轮子故障,这个轮子不会动,轮子上有一个限位开关检测机器人是否离开地面的,测试的时候也没有误触发,所以电机存在故障,后面拆电机的时候再检查。最后再留下一个疑问,这个机器人的回充没有用红外管,机器人是如何识别基站进行返回充电的(因为只买了本体,没买充电桩,不确定充电桩的形状,是不是利用点云识别不确定)懂的请留言。全志的R16,封装是 BGA282,那这个板子至少是4层板,小鱼盲猜 6 层板,知道的小伙伴欢迎留言。
矩阵乘法(暴力,并行加速,stressen,并行加速stressen)
openMP 矩阵乘法 stressen矩阵乘法 openMP加速stressen矩阵乘法 openMP加速普通矩阵乘法
RimWorld Mod开发避坑指南:从Defs命名规范到XML结构详解(附实战代码)
本文深入解析RimWorld Mod开发中Defs文件的编写规范与高级技巧,涵盖命名冲突预防、XML结构优化及高级功能实现。通过实战代码示例,帮助开发者避开常见陷阱,提升Mod兼容性与稳定性,特别适合RimWorld Mod开发者参考。
linux多线程编写矩阵乘法,算法导论学习——分治矩阵乘法
算法导论学习——分治矩阵乘法头文件 结构的定义stdafx.h// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include "targetver.h"#include #include // TODO: 在此处引用程序需要的其他头文件#include using namespace std;#defi...
用VFP计算 CRC-16 Modbus 校验位
1. Modbus是一种串行通信协议,最初由Modicon(目前属于施耐德电气公司)于1979年开发2. Modbus协议是应用在Modicon产品上的,后来才被移植到其他产品上3. Modbus协议的通信接口可以有多种选择,如RS232、RS485、以太网等。
常学常新:《Attention Is All You Need》万字解读!
常学常新:《Attention Is All You Need》万字解读!
32



被折叠的 条评论
为什么被折叠?



