`
fyting
  • 浏览: 216909 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

矩阵的并行运算

    博客分类:
  • Java
阅读更多
这篇文章只是简单使用java concurrent库写了个二维数组运算,并无什么实际意义和技术可言,请仅把我当做标题党。 更有价值的东西来自于以下留言:

Cappuccino 写道
文章的名字叫做《矩阵的并行运算》。既然叫这个名字,关键字想必应该和矩阵,或者是并行计算相关。但是通篇里面除了一个二维数组的简单加减运算,和JDK里面现成的线程池以外,没看到什么其他太多的东西。

个人认为整篇东西里面很多东西都很值得深入的,譬如线程中的互斥是怎样实现的,lock、开关量,或者是Atom变量。或者是矩阵,可以尝试有没有其他更好,更有效率的办法。如果是深入JDK的一些办法,也可以尝试看一下源码,TreeMap和HashMap到底有什么不同,为什么选这个,另外Collections.synchronizedMap是怎样实现的,让一个集合可以变为同步的。

感觉上Java最大的误导是导致使用Java的人认为他们可以用JDK实现非常非常多的东西,但实际上我们都只是在用着Sun实现的很多东西罢了,而且也并没有去弄清楚一下一个东西它内部是怎样做的,怎么样才是最好最有效的。建议你可以尝试深入很多东西,多弄点底层的东西也算是好事,毕竟软件也是相对越底层相对越吃香的o(∩_∩)o


----------------------------------------------------------------------
原文:

最近正被项目的并发问题搞得焦头烂额,在封装的语义和项目需求上似乎都出现了问题,迟迟实现不了。昨天无意中看到这个招聘题,挺有意思的。出题人的本意可能是想考考时下流行的并行运算,受限于CPU,在PC上这种纯运算的效果并不明显,但并发倒是以后的一种趋势…
引用
- 使用Java多线程实现下述算法:
输入:整数组成的m*n的矩阵A。(m=100000, n=10000)
输出:一个数列B,数列B中的每一项为矩阵A中对应列数字之和

CPU的核心是越来越多了,以后并行运算是一种趋势,越来越多的程序需要考虑使用并行运算来加速,硬件厂商给了我们翻倍的CPU,而不是翻倍的速度,真麻烦 ……

首先定义一个类,就叫做MatrixSolver吧
package fyting.iteye.com;
public class MatrixSolver
{
	private final int[][] matrix;
	private final int maxThreads;
	private final Map<Integer, Integer> results = Collections.synchronizedMap(new TreeMap<Integer, Integer>());
	public void start(){
		//...
	}
}

写一个main方法来测试:
public static void main(String[] args)
{
	final int row = 5000, column = 2000;
	final int[][] data = new int[row][column];
	for(int i = 0 ; i < row; i++) {
		for(int j = 0; j < column; j++) {
			data[i][j] = j;
		}
	}
	final int maxThreads = 3;
	MatrixSolver solver = new MatrixSolver(maxThreads, data);
	solver.start();
}

然后是实现的代码,利用JDK5的线程池,可以很轻松实现:
(事实上,JDK里CyclicBarrier的javadoc就是一个解矩阵的例子)
public void start()
{
	ExecutorService executor = Executors.newFixedThreadPool(maxThreads);
	final long st = System.nanoTime();
	if(this.matrix.length == 0) {
		System.err.println("no matrix data!");
		return;
	}
	final int columnCount = this.matrix[0].length;
	final CountDownLatch latch = new CountDownLatch(columnCount);
	for(int i = 0 ; i < columnCount; i++) {
		final int column = i;
		executor.execute(newTask(column,latch));
	}
	try {
		latch.await();
		executor.shutdown();
		long et = System.nanoTime();
		long time = (et - st) / (1000*1000);
		System.out.println("success, time: " + time + "ms");
		executor.awaitTermination(1, TimeUnit.SECONDS);
	}
	catch(InterruptedException e) {
		e.printStackTrace();
	}
	System.out.println("maxtrix: " + (matrix.length + "*" + matrix[0].length));
	System.out.println("column0==>" + ArrayUtils.toString(matrix[0]));
	System.out.println("results==>" + results);
}

protected Runnable newTask(int column, CountDownLatch latch)
{
	return new ColumnSolver(column,latch);
}

private class ColumnSolver extends Thread
{
	private final int columnIndex;
	private final CountDownLatch latch;

	ColumnSolver(int columnIndex, CountDownLatch latch)
	{
		this.columnIndex = columnIndex;
		this.latch = latch;
	}

	@Override
	public void run()
	{
		int count = 0;
		for(int j = 0, rowCount = matrix.length; j < rowCount; j++) {
			count += matrix[j][columnIndex];
		}
		results.put(columnIndex, count);
		latch.countDown();
	}
}

当然,如果是JDK1.4,可以用单独的Doug Lea大师写的java concurrent包,否则需要自己实现线程池了,很麻烦。如下面这样的代码,很容易出错,实在是没有必要在项目中采用。

class ThreadPool
{
	private final LinkedList<Runnable> tasks = new LinkedList<Runnable>();
	private final Thread[] workers;

	public ThreadPool(int maxThreads)
	{
		if(maxThreads <= 0) throw new IllegalArgumentException("maxThreads must > 0");
		this.workers = new Thread[maxThreads];
		for(int i = 0; i < maxThreads; i++) {
			workers[i] = new WorkThread();
			workers[i].start();
		}
	}

	private class WorkThread extends Thread
	{
		public void run() {
            Runnable r;
            while(true) {
                synchronized(tasks) {
                    while (tasks.isEmpty()) {
                        try
                        {
                        	tasks.wait();
                        }
                        catch (InterruptedException ex)
                        {
//                        	ex.printStackTrace();
                        	return;
                        }
                    }
                    r = (Runnable) tasks.removeFirst();
                }
                try {
                    r.run();
                }
                catch (RuntimeException e) {
                	e.printStackTrace();
                }
                synchronized(ThreadPool.this) {
                	ThreadPool.this.notifyAll();
//                	System.out.println(tasks.size() + " remaining");
                }
            }
        }
	}

	synchronized void waitAndShutdown() throws InterruptedException
	{
		while(this.tasks.size() != 0) {
			wait();
		}
		for(Thread t: workers) {
			synchronized(t) {
				t.interrupt();
			}
		}
	}

	public void submit(Runnable runnable)
	{
		 synchronized(this.tasks) {
			 this.tasks.addLast(runnable);
			 this.tasks.notify();
	    }
	}
}

附件中有3个不同的类,分别是利用JDK1.5和JDK1.4,以及单线程的实现。
0
0
分享到:
评论

相关推荐

    矩阵并行运算练习

    在IT领域,矩阵并行运算是一项重要的计算技术,特别是在高性能计算和大数据分析中。本练习“矩阵并行运算练习”是针对C#网络编程的一次作业,旨在让学生掌握如何利用C#语言进行矩阵运算,并利用并行处理能力提高计算...

    矩阵乘法mpi实现 并行运算

    矩阵乘法mpi实现 并行运算 在linux下成功运行 使用mpicc -o 编译 使用mpirun命令运行

    大矩阵运算的并行程序

    大矩阵乘法运算的并行算法实现 ......................................... ................................................ .....................................................

    MainWindow.xaml.cs

    编写一个WPF应用程序,利用数据...(1)在代码中用多任务通过调用某方法实现矩阵并行运算,在调用的参数中分别传递M、N、P的大小。 (2)程序中至少要测试3次有代表性的不同大小的矩阵运算,并显示其并行运行用时。

    A.3矩阵并行计算练习

    在IT行业中,矩阵并行计算是一项关键的技术,尤其在高性能计算和大数据分析领域。本练习主要关注使用C#语言在网络应用编程中实现矩阵并行计算,结合WPF(Windows Presentation Foundation)进行用户界面的构建。这是...

    C#实验--- A.3 矩阵并行计算练习

    在本实验“C#实验--- A.3 矩阵并行计算练习”中,我们将深入探讨如何利用C#语言进行高效的矩阵运算,并利用多线程和并行处理技术提高计算速度。《C#网络应用编程》这门课程强调了在实际应用中,尤其是在大数据处理和...

    FPGA实现各种矩阵运算

    FPGA在信号处理、数据计算等方面具有高速并行处理的优势,尤其在矩阵运算中,能够显著提高计算效率。本主题主要探讨了如何利用FPGA来实现各种矩阵运算。 矩阵运算广泛应用于图像处理、通信系统、机器学习等多个领域...

    矩阵计算_labview矩阵计算_labview矩阵运算_

    9. **并行处理**:LabVIEW的并行计算能力使得矩阵运算可以在多核处理器上加速,提高了计算效率。例如,可以使用并行数组运算节点来同时处理多个矩阵元素。 10. **数据可视化**:LabVIEW强大的图形化界面使得结果的...

    Mali-T604 GPU的二维浮点矩阵运算并行优化方法.pdf

    Mali-T604 GPU 的二维浮点矩阵运算并行优化方法 概述: 本文研究了基于Mali-T604 GPU 的二维浮点矩阵运算并行优化方法,旨在提高矩阵乘法的计算效率。通过在Arndale Board 开发平台上进行实验,结果显示基于Mali ...

    一种在GPU上高精度大型矩阵快速运算的实现

    该技术通过采用Kahan求和公式确保了计算精度,并根据GPU的特点设计了矩阵分块方式和内存分配机制,以减少数据访问次数并充分发挥GPU的并行计算能力,从而显著提升了大型矩阵乘法的运算速度与精度。 #### GPU在矩阵...

    CPU-OpenMP和GPU-CUDA并行计算技术对矩阵乘法运算的加速效果分析.pdf

    "CPU-OpenMP和GPU-CUDA并行计算技术对矩阵乘法运算的加速效果分析" 本文主要对比了CPU-OpenMP和GPU-CUDA并行计算技术对矩阵乘法运算的加速效果。矩阵乘法运算是许多科学计算和数据处理领域中的一种基本运算,它的...

    并行运算矩阵乘

    有助于学习并行程序开发 可以在本机上或者巨型机上运行

    delphi矩阵运算源码

    7. **优化和性能**:考虑到矩阵运算通常涉及大量计算,源码可能采用了优化策略,如缓存友好的数据布局、并行计算或者利用SIMD(单指令多数据)指令加速。 8. **错误检查和异常处理**:在实际应用中,源码应包含适当...

    用verilog语言来描述矩阵乘法运算的代码

    在这个场景中,我们将探讨如何使用Verilog语言来描述矩阵乘法运算。 矩阵乘法是线性代数中的基本操作,广泛应用于计算机科学、工程和数学等领域。在Verilog中,我们可以通过并行和串行计算策略来实现矩阵乘法。下面...

    C++各种矩阵的运算

    对于矩阵运算,这可能涉及到算法的选择、内存管理优化和并行计算的利用。 5. **最小二乘拟合**:最小二乘法是解决过定系统(观测值多于未知参数)的一种方法,它通过最小化残差平方和来找到最佳拟合直线或曲线。在...

    矩阵运算(C++)

    总之,C++中的矩阵运算不仅涉及到基本的数学操作,还涵盖了高效内存管理、错误检查、并行化等多个方面。通过创建和优化Matrix类,我们可以构建一个强大且高效的矩阵运算库,满足各种科学计算的需求。

    并行运算与神经网络-基于CPU/GPU的并行神经网络运算

    并行运算与神经网络是现代计算领域中的重要概念,尤其在大数据处理和人工智能技术中扮演着核心角色。基于CPU和GPU的并行神经网络运算,是实现高效、快速计算的关键技术,它们极大地提升了模型训练的速度,降低了计算...

    opencl 多gpu矩阵数组运算

    针对标题和描述中的关键词,我们将深入探讨OpenCL如何实现多GPU矩阵和数组运算。 1. **OpenCL多GPU运算**: 在OpenCL中,计算设备可以是单个GPU,也可以是多个GPU组成的群集。通过OpenCL的平台模型,开发者可以...

Global site tag (gtag.js) - Google Analytics