//并行计算数组的和
public class ConcurrentCalculator {
private ExecutorService exec;
private int cpuCoreNumber;
private List<Future<Long>> tasks = new ArrayList<Future<Long>>();
public ConcurrentCalculator() {
cpuCoreNumber = Runtime.getRuntime().availableProcessors();
exec = Executors.newFixedThreadPool(cpuCoreNumber);
}
public Long sum(final int[] numbers) {
// 根据CPU核心个数拆分任务,创建FutureTask并提交到Executor
for (int i = 0; i < cpuCoreNumber; i++) {
int increment = numbers.length / cpuCoreNumber + 1;
int start = increment * i;
int end = increment * i + increment;
if (end > numbers.length)
end = numbers.length;
SumCalculator subCalc = new SumCalculator(numbers, start, end);
FutureTask<Long> task = new FutureTask<Long>(subCalc);
tasks.add(task);
if (!exec.isShutdown()) {
exec.submit(task);
}
}
return getResult();
}
/**
* 迭代每个只任务,获得部分和,相加返回
*
* @return
*/
public Long getResult() {
Long result = 0l;
for (Future<Long> task : tasks) {
try {
// 如果计算未完成则阻塞
Long subSum = task.get();
result += subSum;
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return result;
}
public void close() {
if (!exec.isShutdown())
exec.shutdown();
}
// 内部类
class SumCalculator implements Callable<Long> {
private int[] numbers;
private int start;
private int end;
public SumCalculator(final int[] numbers, int start, int end) {
this.numbers = numbers;
this.start = start;
this.end = end;
}
public Long call() throws Exception {
Long sum = 0l;
for (int i = start; i < end; i++) {
sum += numbers[i];
}
return sum;
}
}
public static void main(String[] args) {
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13 };
ConcurrentCalculator calc = new ConcurrentCalculator();
Long sum = calc.sum(numbers);
System.out.println(sum);
calc.close();
}
}
分享到:
相关推荐
然后,核心A计算数组的前50个元素之和,并将结果存储在`resultA`中。同时,它会更新`progress`变量的值,表示其子任务已完成。 核心B的`main`函数与核心A类似,但处理数组的后50个元素。计算完成后,结果存储在`...
陈国良教授在书中详尽阐述了并行计算的基本概念,包括并行性级别、数据并行性和任务并行性,以及并行计算的优势和挑战。 书中的“Prefix-Sum(PRAM-EREW)”例子,涉及到了并行计算中的一个重要算法——前缀和...
在本文中,我们将深入探讨如何使用CUDA技术进行并行计算,特别是针对数组求和操作的优化。CUDA(Compute Unified Device Architecture)是由NVIDIA推出的一种并行计算平台和编程模型,它允许开发者利用GPU(图形...
在本案例中,"计算数组的相关系数"指的是通过特定算法处理两个数值数组,以确定它们之间的关联强度。 计算相关系数的方法最常见的是皮尔逊积矩相关系数(Pearson correlation coefficient),它是基于两个数组的...
总的来说,Qt并行计算提供了一套完整的工具,使得开发者能够在Qt应用程序中轻松地实现多线程和并行处理,从而最大化利用现代计算机的多核性能。通过合理地使用这些工具,可以编写出高效、响应迅速的应用程序,提升...
并行计算通常使用两种主要的并行编程模型:Message Passing Interface (MPI) 和 OpenMP。MPI 是一种用于分布式内存系统的并行编程模型,它允许程序中的不同进程通过消息传递进行通信。而OpenMP 是一种共享内存并行...
这个“opencl异构并行计算随书源码”提供了与《OpenCL异构并行计算第二版》教材配套的实践代码,是深入理解和应用OpenCL的重要辅助资源。 首先,让我们深入了解OpenCL的基本概念。OpenCL由Khronos Group维护,旨在...
并行计算是指利用多种计算资源同时处理计算任务的方法,旨在提升计算机系统的计算速度和处理能力。它通过多个处理器协同工作来解决同一个问题,即将待解决问题分解为若干个可以独立处理的部分。并行计算分为时间上的...
支持数据并行和任务并行两种并行计算模型,分别适用于需要同时处理大量数据的情况和需要分解成多个独立子任务进行处理的情况。 - **使用parfor(并行for循环)和spmd(单程序多数据)注释代码段**:这些高级结构简化...
在MATLAB中,我们可以利用并行计算工具箱(Parallel Computing Toolbox)来实现这一目标,该工具箱提供了多种并行计算策略,如数据并行、任务并行和分布式内存并行。 `rparallel3`函数的目的是计算n个电阻器并联时...
内容概要:本文介绍了在进行GPU并行计算时,一种使用MATLAB实现数组A(大小为48×48)赋值的方法。具体步骤包括创建一个特定模式的一维数组D,接着遍历D数组来构建A,使得对于每个D(k,:)索引组所指定的位置赋值为1。...
本资源"matlab异步并行计算.rar"着重介绍了如何利用MATLAB的`parfeval`函数和`distributed`工作空间进行这样的计算。下面将详细解释这两个关键工具以及它们在实现异步并行计算中的作用。 首先,`parfeval`是MATLAB...
并行计算与串行计算的区别在于,前者利用了时间和空间上的并行性。时间上的并行通过流水线技术实现,而空间上的并行则依靠多个处理器同时执行计算任务。 **2. 并行化方法** - **域分解**:这种方法涉及将数据划分...
**Numba:加速Python与CUDA并行计算的利器...总结来说,Numba是Python科学计算中的一种强大工具,尤其在并行计算和GPU加速方面表现突出。通过熟练掌握Numba,开发者可以显著提升代码性能,实现复杂计算任务的高效执行。
Matlab 并行计算技巧和应用案例分享 Matlab 作为一款强大的科学计算软件,提供了许多并行计算的工具和函数,可以帮助用户充分利用计算机的多核心和集群资源,提高计算效率。下面是 Matlab 并行计算的一些技巧和应用...
总结起来,Matlab 并行计算的优化策略主要包括利用并行计算工具箱、数据分解和任务分解、GPU 并行计算、多线程编程以及调整算法和数据结构。通过合理地运用这些策略,我们可以充分发挥并行计算的优势,提高计算性能...
在使用"埃博拉酱的并行计算工具箱"前,用户应确保已安装MATLAB并行计算工具箱,并了解基本的并行计算原理和MATLAB编程基础。通过阅读“说明.txt”文件,用户可以获取关于如何安装、配置并行计算环境以及如何使用提供...
Matlab并行计算工具箱提供了多种工具和函数,例如parfor(并行for循环)、spmd(同步并行多进程指令)和distributed数组,使得用户能够轻松地将现有代码转换为并行代码。此外,它还支持GPU计算,通过CUDA或OpenCL...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。其核心思想是分治法,通过...通过实验,学生不仅可以掌握排序算法,还能理解并行计算的基本原理和实践,提高对并行算法设计和优化的能力。