这篇文章只是简单使用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,以及单线程的实现。
分享到:
相关推荐
在IT领域,矩阵并行运算是一项重要的计算技术,特别是在高性能计算和大数据分析中。本练习“矩阵并行运算练习”是针对C#网络编程的一次作业,旨在让学生掌握如何利用C#语言进行矩阵运算,并利用并行处理能力提高计算...
矩阵乘法mpi实现 并行运算 在linux下成功运行 使用mpicc -o 编译 使用mpirun命令运行
大矩阵乘法运算的并行算法实现 ......................................... ................................................ .....................................................
编写一个WPF应用程序,利用数据...(1)在代码中用多任务通过调用某方法实现矩阵并行运算,在调用的参数中分别传递M、N、P的大小。 (2)程序中至少要测试3次有代表性的不同大小的矩阵运算,并显示其并行运行用时。
在IT行业中,矩阵并行计算是一项关键的技术,尤其在高性能计算和大数据分析领域。本练习主要关注使用C#语言在网络应用编程中实现矩阵并行计算,结合WPF(Windows Presentation Foundation)进行用户界面的构建。这是...
在本实验“C#实验--- A.3 矩阵并行计算练习”中,我们将深入探讨如何利用C#语言进行高效的矩阵运算,并利用多线程和并行处理技术提高计算速度。《C#网络应用编程》这门课程强调了在实际应用中,尤其是在大数据处理和...
FPGA在信号处理、数据计算等方面具有高速并行处理的优势,尤其在矩阵运算中,能够显著提高计算效率。本主题主要探讨了如何利用FPGA来实现各种矩阵运算。 矩阵运算广泛应用于图像处理、通信系统、机器学习等多个领域...
9. **并行处理**:LabVIEW的并行计算能力使得矩阵运算可以在多核处理器上加速,提高了计算效率。例如,可以使用并行数组运算节点来同时处理多个矩阵元素。 10. **数据可视化**:LabVIEW强大的图形化界面使得结果的...
Mali-T604 GPU 的二维浮点矩阵运算并行优化方法 概述: 本文研究了基于Mali-T604 GPU 的二维浮点矩阵运算并行优化方法,旨在提高矩阵乘法的计算效率。通过在Arndale Board 开发平台上进行实验,结果显示基于Mali ...
该技术通过采用Kahan求和公式确保了计算精度,并根据GPU的特点设计了矩阵分块方式和内存分配机制,以减少数据访问次数并充分发挥GPU的并行计算能力,从而显著提升了大型矩阵乘法的运算速度与精度。 #### GPU在矩阵...
"CPU-OpenMP和GPU-CUDA并行计算技术对矩阵乘法运算的加速效果分析" 本文主要对比了CPU-OpenMP和GPU-CUDA并行计算技术对矩阵乘法运算的加速效果。矩阵乘法运算是许多科学计算和数据处理领域中的一种基本运算,它的...
有助于学习并行程序开发 可以在本机上或者巨型机上运行
7. **优化和性能**:考虑到矩阵运算通常涉及大量计算,源码可能采用了优化策略,如缓存友好的数据布局、并行计算或者利用SIMD(单指令多数据)指令加速。 8. **错误检查和异常处理**:在实际应用中,源码应包含适当...
在这个场景中,我们将探讨如何使用Verilog语言来描述矩阵乘法运算。 矩阵乘法是线性代数中的基本操作,广泛应用于计算机科学、工程和数学等领域。在Verilog中,我们可以通过并行和串行计算策略来实现矩阵乘法。下面...
对于矩阵运算,这可能涉及到算法的选择、内存管理优化和并行计算的利用。 5. **最小二乘拟合**:最小二乘法是解决过定系统(观测值多于未知参数)的一种方法,它通过最小化残差平方和来找到最佳拟合直线或曲线。在...
总之,C++中的矩阵运算不仅涉及到基本的数学操作,还涵盖了高效内存管理、错误检查、并行化等多个方面。通过创建和优化Matrix类,我们可以构建一个强大且高效的矩阵运算库,满足各种科学计算的需求。
并行运算与神经网络是现代计算领域中的重要概念,尤其在大数据处理和人工智能技术中扮演着核心角色。基于CPU和GPU的并行神经网络运算,是实现高效、快速计算的关键技术,它们极大地提升了模型训练的速度,降低了计算...
针对标题和描述中的关键词,我们将深入探讨OpenCL如何实现多GPU矩阵和数组运算。 1. **OpenCL多GPU运算**: 在OpenCL中,计算设备可以是单个GPU,也可以是多个GPU组成的群集。通过OpenCL的平台模型,开发者可以...