我现在有过几次同样的需求,并想就构建解决方案的正确方法获得其他想法。需要的是对多个线程上的多个元素执行一些操作,而无需一次将所有元素都放在内存中,只需要计算中的元素。就像,Iterables.partition是不够的,因为它预先将所有元素都放入内存中。
用代码表达,我想写一个 BulkCalc2,它和 BulkCalc1 做同样的事情,只是并行。下面的示例代码说明了我的最佳尝试。我不满意,因为它又大又丑,但它似乎实现了我的目标,即在工作完成之前保持线程的高度利用,在计算过程中传播任何异常,并且一次在内存中不必有超过numThreads 个 BigThing实例.
我会接受以最简洁的方式满足既定目标的答案,无论是改进 BulkCalc2 的方法还是完全不同的解决方案。
interface BigThing {
int getId();
String getString();
}
class Calc {
// somewhat expensive computation
double calc(BigThing bigThing) {
Random r = new Random(bigThing.getString().hashCode());
double d = 0;
for (int i = 0; i < 100000; i++) {
d += r.nextDouble();
}
return d;
}
}
class BulkCalc1 {
final Calc calc;
public BulkCalc1(Calc calc) {
this.calc = calc;
}
public TreeMap<Integer, …Run Code Online (Sandbox Code Playgroud) 我即将开始一个项目,该项目将获取文本块,将大量数据解析为某种对象,然后可以对其进行序列化、存储和统计/收集数据。这需要尽可能快,因为我需要开始处理 > 10,000,000 个文本块,并且每天将收到 100,000 条。
我在具有 12 个至强核心 + 超线程的系统上运行它。我也可以访问/了解一些关于 CUDA 编程的知识,但对于字符串内容,我认为它不合适。从每个字符串中,我需要解析大量数据,其中一些我知道确切的位置,有些我不知道并且需要使用正则表达式/一些聪明的东西。
所以考虑这样的事情:
object[] parseAll (string [] stringsToParse)
{
parallel foreach
parse( string[n] )
}
object parse(string s)
{
try to use exact positions / substring etc here instead of regex's
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
谢谢你的帮助!对不起,如果这是冗长的。
在一个项目中,我被要求通过 Java 实现共享内存并行化JaMP,它扩展了 Java for OpenMP。我几乎是该领域的初学者,经过 10 分钟的搜索,互联网并没有证明自己很有帮助。
我的主要问题:是JaMP仅 linux 的实现吗?如果没有,开始学习的良好起点是什么?
我使用 MPI 编写了一个小程序来并行化矩阵-矩阵乘法。问题是:在我的电脑上运行程序时,大约需要10秒才能完成,但在集群上大约需要75秒。我想我有一些同步问题,但我无法弄清楚(还)。
这是我的源代码:
/*matrix.c
mpicc -o out matrix.c
mpirun -np 11 out
*/
#include <mpi.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1000
#define DATA_TAG 10
#define B_SENT_TAG 20
#define FINISH_TAG 30
int master(int);
int worker(int, int);
int main(int argc, char **argv) {
int myrank, p;
double s_time, f_time;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
if (myrank == 0) {
s_time = MPI_Wtime();
master(p);
f_time = MPI_Wtime();
printf("Complete in %1.2f seconds\n", f_time - s_time);
fflush(stdout);
}
else {
worker(myrank, …Run Code Online (Sandbox Code Playgroud) 我想在不同的线程中训练多个一类 SVM。有人知道 scikit 的 SVM 是否发布了 GIL?我在网上没有找到任何答案。
谢谢
python parallel-processing multithreading machine-learning scikit-learn
在 Windows 7 和 Ubuntu 64 位 11.04 上的 Revolution R 2.12.2 中,我有一个超过 100K 行和 100 多列的数据框,并且我为每个原始列派生了 ~5 列(sqrt、log、log10 等)并将它们添加到同一个数据框中。如果没有使用 foreach 和 %do% 的并行性,这可以正常工作,但速度很慢。当我尝试将它与 foreach 和 %dopar% 并行化时,它不会访问全局环境(以防止竞争条件或类似情况),因此我无法修改数据框,因为“未找到”数据框对象。
我的问题是我怎样才能让它更快?换句话说,如何并行化列或转换?
简化示例:
require(foreach)
require(doSMP)
w <- startWorkers()
registerDoSMP(w)
transform_features <- function()
{
cols<-c(1,2,3,4) # in my real code I select certain columns (not all)
foreach(thiscol=cols, mydata) %dopar% {
name <- names(mydata)[thiscol]
print(paste('transforming variable ', name))
mydata[,paste(name, 'sqrt', sep='_')] <<- sqrt(mydata[,thiscol])
mydata[,paste(name, 'log', sep='_')] <<- log(mydata[,thiscol])
}
}
n<-10 # I …Run Code Online (Sandbox Code Playgroud) 我目前正在思考多线程应用程序可能无法很好扩展的原因。
我知道并一直与之抗争的两个原因是:
还有什么问题?
好的,代码是:
vector<vector<double>> imageFiltered;
// some processing codes here
parallel_for( blocked_range<unsigned>(0, imageFiltered.size()),
[=](const blocked_range<unsigned>& r) {
for( unsigned i = r.begin(); i != r.end(); ++i ){
for( unsigned j = 0; j != imageFiltered[i].size(); ++j ) {
imageFiltered[i][j] = 0; // error here?expression must be a modifiable lvalue
}
}
});
Run Code Online (Sandbox Code Playgroud)
我写了另一个类似的代码块,它工作得很好。所以,这里有一点帮助。PS:parallel_for 来自 Interl TBB。
我尝试使用 OpenMP 在分区部分和 QuickSort 部分并行化 QuickSort。我的C代码如下:
#include "stdlib.h"
#include "stdio.h"
#include "omp.h"
// parallel partition
int ParPartition(int *a, int p, int r) {
int b[r-p];
int key = *(a+r); // use the last element in the array as the pivot
int lt[r-p]; // mark 1 at the position where its element is smaller than the key, else 0
int gt[r-p]; // mark 1 at the position where its element is bigger than the key, else 0
int cnt_lt = 0; …Run Code Online (Sandbox Code Playgroud) 我想svd()在 R 中的大型稀疏矩阵 (17k x 2m) 上运行,并且我可以访问集群。有没有一种使用多核在 R 中计算 SVD 的直接方法?
RScaLAPACK 包(http://www.inside-r.org/packages/cran/RScaLAPACK)似乎使这成为可能,但它似乎不再受到积极支持(http://cran.r-project.org /web/packages/RScaLAPACK/),我认为这是有原因的。