我有一个简单的问题,我有简单的Parallel for循环.这个for循环是windows服务的一部分.当有人停止服务时,我想停止循环.我可以找到三种停止并行的方法,即if条件.停止并行for循环的最佳方法是什么?有什么区别?
CancellationTokenSource cancellationToken = new CancellationTokenSource();
ParallelOptions options = new ParallelOptions();
options.CancellationToken = cancellationToken.Token;
Parallel.For(0, maximum_operations, options, (a, loopState) =>
{
{
//Do something
if(!KeepProcessing)
{
//loopState.Break();
//loopState.Stop();
cancellationToken.Cancel();
}
}
});
Run Code Online (Sandbox Code Playgroud) 我知道你可以设置用于所有.par操作的线程数,如下所示:
collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int)
但是,是否可以设置仅用于一个.par调用的线程数?
我正在考虑采用大矩阵的逆矩阵,通常大小为1000 x 1000,但有时超过100000 x 100000(由于时间和内存,目前失败).我知道正常的情绪是"不要反过来,找其他方法去做",但目前这是不可能的.造成这种情况的原因是由于已经制作的软件需要使矩阵反转.(注意:我正在研究如何改变这种情况,但这需要很长时间)
目前我们正在使用数值重新复制的LU分解方法,我目前正在测试特征库.特征库似乎更稳定,速度更快,但我仍在测试阶段的准确性.我已经快速浏览了其他库,例如ATLAS和LAPACK,但尚未对这些库进行任何实质性测试.
似乎特征库不使用并发方法来计算逆(尽管对于逆分的LU分解部分也是如此),并且据我所知,ATLAS和LAPACK在此限制中是相似的.(我目前正在使用openMP测试特征的速度差异而没有.)
第一个问题是任何人都可以解释如何通过并行化优化矩阵求逆.我在这里发现了一篇关于矩阵求逆并行算法的文章,但我不明白.看来这篇文章谈到另一种方法?我也不确定scaLAPACK或PETSc是否有用?
第二个问题,我看了这个文章使用GPU来提高性能的,但我从来没有编码的GPU,因此不知道是什么人所要表达的,但在底部的图表看起来相当惊人.这怎么可能,以及如果要成为现实,我该如何开始实现这样的事情.
我也发现这篇文章,还有时间阅读它来理解,但它似乎很有希望,因为内存是我们软件的当前问题.
有关这些文章或一般问题的任何信息都会有很大帮助.如果这个问题看起来含糊不清,我再次道歉,如果有必要,我会尽量扩大.
parallel-processing concurrency linear-algebra matrix-inverse eigen
我的项目是使用OpenMP在C中做一些并行的算法.现在我想用Python做同样的项目.有没有类似于openmp for python的东西?
我试图在使用RStudio的16核CPU和64 GB RAM的Windows服务器上运行foreach循环.(使用doParallel包)
"worker"进程复制来自for循环外部的所有变量(通过在运行foreach循环时观察windows任务管理器中这些进程的实例化来观察),从而使每个进程使用的内存膨胀.我试图将一些特别大的变量声明为全局变量,同时确保这些变量也在foreach循环中读取,而不是写入,以避免冲突.但是,这些进程仍然会快速耗尽所有可用内存.
是否有一种机制可以确保"工作"进程不会创建某些"只读"变量的副本?比如声明这样的变量的具体方法?
当我使用mclapply时,不时(真正随机)它会给出不正确的结果.这个问题在互联网上的其他帖子中有详尽的描述,例如(http://r.789695.n4.nabble.com/Bug-in-mclapply-td4652743.html).但是,没有提供解决方案.有谁知道如何解决这个问题?谢谢!
请注意:这不是一个重复的问题,因为这个问题规定了所有方法Iterator,而不仅仅是map和flatMap.因此Future.traverse不是一个好的答案.
假设我有这个简单的陈述:
(1 to 100).toSet.subsets.find(f)
Run Code Online (Sandbox Code Playgroud)
它完美地运作.它是懒惰的,不会使用大量内存,只要找到一个元素就会返回.当您想并行化时,问题就开始了.你也许会说,这是斯卡拉,必须有.par或Iterator,但没有.
互联网上提出的解决方案是使用.grouped,但它不如我想要的那么好.为什么?
val it = (1 to 100).toSet.subsets.grouped(1000000).map(_.par.find(f)).flatten
if (it.hasNext) Some(it.next) else None
Run Code Online (Sandbox Code Playgroud)
使用更多的内存.我知道它仍然是O(1),但让我们在这里完美:)
它不是完全可并行化的(根据Amdahl定律).当.grouped消耗下一个百万元素块的迭代器时,除了一个线程之外的所有元素都在等待.如果迭代器消耗昂贵,则这尤其成问题.此外,还需要产生一组新线程来处理新块的开销.
生成更复杂/更长的代码(参见示例).如果Iterator有.nextOption,它会缩短代码,但仍然.
尽管编程我自己的生产者 - 消费者模型(迭代器是生产者,线程是消费者)然后最终减少步骤,还有什么吗?
在它的帮助中detectCores()说:
这不适合直接用于mclapply的mc.cores参数,也不适用于指定 makeCluster中的核心数.首先是因为它可能返回NA,其次是因为它没有给出允许的核心数.
但是,我已经看到了相当多的示例代码,如下所示:
library(parallel)
k <- 1000
m <- lapply(1:7, function(X) matrix(rnorm(k^2), nrow=k))
cl <- makeCluster(detectCores() - 1, type = "FORK")
test <- parLapply(cl, m, solve)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)
where detectCores()用于指定其中的核心数makeCluster.
我的用例包括在我自己的多核笔记本电脑(OSX)上运行并行处理并在各种多核服务器(Linux)上运行它.因此,我不确定是否有更好的方法来指定内核数量,或者是否对于不使用的建议detectCores更多的是针对包含在广泛的硬件和操作系统环境中运行代码的开发人员.
总结如下:
detectCoresR中的函数来指定并行处理的核心数?给定n部分和,可以将log2并行步骤中的所有部分和相加.例如,假设有八个线程与八个部分和:s0, s1, s2, s3, s4, s5, s6, s7.这可以在这样的log2(8) = 3连续步骤中减少;
thread0 thread1 thread2 thread4
s0 += s1 s2 += s3 s4 += s5 s6 +=s7
s0 += s2 s4 += s6
s0 += s4
Run Code Online (Sandbox Code Playgroud)
我想用OpenMP做这个,但我不想使用OpenMP的reduction子句.我想出了一个解决方案,但我认为可以使用OpenMP的task子句找到更好的解决方案.
这比标量加法更通用.让我选择一个更有用的情况:一个数组减少(见这里,这里,并在这里为更多关于阵列减少).
假设我想在阵列上进行数组缩减a.下面是一些代码,它们为每个线程并行填充私有数组.
int bins = 20;
int a[bins];
int **at; // array of pointers to arrays
for(int i = 0; i<bins; i++) a[i] = 0;
#pragma omp …Run Code Online (Sandbox Code Playgroud) 我正在使用Anaconda分发的Python和Numba,我编写了以下Python函数,它将稀疏矩阵A(以CSR格式存储)乘以密集向量x:
@jit
def csrMult( x, Adata, Aindices, Aindptr, Ashape ):
numRowsA = Ashape[0]
Ax = numpy.zeros( numRowsA )
for i in range( numRowsA ):
Ax_i = 0.0
for dataIdx in range( Aindptr[i], Aindptr[i+1] ):
j = Aindices[dataIdx]
Ax_i += Adata[dataIdx] * x[j]
Ax[i] = Ax_i
return Ax
Run Code Online (Sandbox Code Playgroud)
这A是一个大的scipy稀疏矩阵,
>>> A.shape
( 56469, 39279 )
# having ~ 142,258,302 nonzero entries (so about 6.4% )
>>> type( A[0,0] )
dtype( 'float32' )
Run Code Online (Sandbox Code Playgroud)
并且 …