看着购买一对Xeon Phi 5110P,但试图估计我需要改变多少代码或其他需要的软件.
目前我利用好R对多核心的Windows机器(24个内核)使用foreach包,通过它其他的包forecast,glmnet等做我的并行处理.
有一个Xeon Phi我明白我想编译R
https://software.intel.com/en-us/articles/running-r-with-support-for-intel-xeon-phi-coprocessors我明白这可能是完成了Parallel Studio XE的跟踪版本.
那么我是否需要编辑R的Makeconf文件,添加C/C++标志和Phi?在Parallel Studio上的跟踪到期之前编译所有需要的包?或者我是否不需要编辑Makeconf以获得foreachPhi 的好处?
似乎其中一些将在编译R后自动处理,并由Math Kernel Library(MKL)完成卸载,但我不完全确定这一点.
一些相关的问题:英特尔至强融核是否可以在没有昂贵的英特尔编译器的情况下使用?
此外revolutionanalytics.com似乎有一些相关的博客文章,但不是完全确凿的对我来说:http://blog.revolutionanalytics.com/2015/05/behold-the-power-of-parallel.html
我有两个向量,a [n]和b [n],其中n是一个大数.
a[0] = b[0];
for (i = 1; i < size; i++) {
a[i] = a[i-1] + b[i];
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,我们尝试实现a [i]包含b []中所有数字的总和,直到b [i].我需要使用openmp并行化这个循环.
主要的问题是a [i]取决于[i-1],因此我想到的唯一直接方法是等待每个[i-1]数字准备就绪,这需要花费大量时间并没有任何意义.openmp中有没有解决这个问题的方法?
我正在使用Mayavi2 mlab模块进行一些科学可视化。我想将大约10万个文件可视化并另存为图像,以便稍后将它们组合到gif动画中。为了加快这种可视化,我将使用多处理模块。下面是一个简单的示例。
from mayavi import mlab
def test_plot3d(dummy):
mlab.options.offscreen = True
l = mlab.plot3d([1,2], [1,2], [1,2])
mlab.savefig(str(dummy)+".png")
mlab.close()
from multiprocessing import Pool
NP = 2
pool = Pool(NP,maxtasksperchild=1)
res = pool.imap(test_plot3d,[x for x in xrange(0,4000)])
for r in res:
print "OK"
print "FINISH"
Run Code Online (Sandbox Code Playgroud)
当NP为2时,一切正常。当NP> 2时,出现下一个错误:
[xcb] Unknown sequence number while processing queue [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
Run Code Online (Sandbox Code Playgroud)
该程序会生成一些图像,但是会挂在其他图像上,因此它永远不会完成。Google告诉我,这与GTK和多线程有关,但是我将pool的maxtasksperchild指定为1,这意味着每个进程只有一个任务,然后它将重新启动,并且每个进程上只有一个mayavi实例(但是如我所见,它不会发生)。
因此,问题是如何正确启动用于并行mayavi可视化的进程池?
python parallel-processing visualization mayavi python-multiprocessing
我有一个非常大的数据框,包含790,000行和140个预测变量。其中一些相互之间具有很强的相关性,并且规模不同。有了这个randomForest程序包,我可以只使用一小部分数据在每个核心上生长一个森林,然后使用foreach它们并将其与combine()函数合并以获得一棵大树,如下所示:
rf.STR = foreach(ntree=rep(125, 8), .combine=combine, .multicombine=TRUE, .packages='randomForest') %dopar% {
sample.idx = sample.int( nrow(dat), size=sample.size, replace=TRUE)
randomForest(x=dat[sample.idx,-1, with=FALSE],
y=dat[sample.idx, retention], ntree=ntree)
}
Run Code Online (Sandbox Code Playgroud)
不同尺度上的相关变量使我想使用party软件包中的条件随机森林,但是没有combine()关于森林的方法,因此我不确定如何组合多个森林对象来获得一个重要图或一个预测。
有没有办法在较小的数据子集上训练一个大森林,或者制作几个小森林并将它们组合成一个更大的条件森林模型?
我天真地冒险使用以下命令来处理数据文件:
cat old.one | parallel --pipe 'sed -r "s/\./\,/g"' > new.one
Run Code Online (Sandbox Code Playgroud)
目标是取代"." 用",".但结果文件与顺序处理获得的文件不同:
sed -r "s/\./\,/g" old.one > new.one
Run Code Online (Sandbox Code Playgroud)
也许并行工作可以不同的方式完成?在没有信号量的情况下,这将是很好的,并且仅在最后组合这些部分.
解
非常感谢!这是我的结果:
sed:13.834 s
sed -r"s /./,,/ g"old.one> new.one
平行sed:12.489 s
猫old.one | parallel -k --pipe'sed -r"s /./\,/ g"'> new.one
tr:6.480秒
猫old.one | tr"." ","> new.one
并行tr:5.848 s
cat new.one | parallel -k --pipe tr"." ","> old.one
我试图用一个非常简单的例子来测试parMap vs map:
import Control.Parallel.Strategies
import Criterion.Main
sq x = x^2
a = whnf sum $ map sq [1..1000000]
b = whnf sum $ parMap rseq sq [1..1000000]
main = defaultMain [
bench "1" a,
bench "2" b
]
Run Code Online (Sandbox Code Playgroud)
我的结果似乎表明parMap没有加速,我想知道为什么会这样?
benchmarking 1
Warning: Couldn't open /dev/urandom
Warning: using system clock for seed instead (quality will be lower)
time 177.7 ms (165.5 ms .. 186.1 ms)
0.997 R² (0.992 R² .. 1.000 R²)
mean 185.1 ms (179.9 ms .. 194.1 ms) …Run Code Online (Sandbox Code Playgroud) 我正在编写一个C++程序,对闭合的Knight巡演进行蛮力搜索.代码在这里.
我想使用OpenMP并行化这个.我的问题是以一种创造足够程度的并行性的方式来做到这一点.目前,我的代码的相关部分看起来像这样
#pragma omp parallel for reduction(+:count) if (depth==4)
for (size_t i=0;i<g.neighbours[last].size();i++){
auto n = g.neighbours[last][i];
// See if n can be used to extend or complete the tour
Run Code Online (Sandbox Code Playgroud)
这if (depth==4)是我尝试确保没有创建太多并行任务,但另一方面创建了足以保持所有处理器繁忙的任务.设置depth==2不会更改程序的运行时.
这似乎没有成功.对于3x12问题,在我的双核处理器上,OpenMP版本消耗的总CPU时间约为130秒,而没有OpenMP的单线程版本需要大约40秒的CPU时间.
我将很感激有关如何更好地使用OpenMP的建议或者不适合此问题的原因.
更新:感谢@Zulan我有一个使用OpenMP任务的更新版本,具有更快的顺序性能和良好的并行化.
是否有一种方便有效的方式以NUMA识别方式使用cpp标准容器API?
我想在cpp环境中进行OpenMP并行稀疏矩阵向量乘法.要分配和初始化关于NUMA域的向量和矩阵值,C代码将以某种方式看起来像这样:
size_t N = 1000000;
double* vecVal = malloc (N*sizeof(double));
#pragma OMP parallel for
for (size_i=0; i<N; ++i)
{
vecVal[i] = 0.;
}
/* do spMV */
delete vecVal;
Run Code Online (Sandbox Code Playgroud)
在Cpp中我想使用std :: vector(具有固定大小的std :: array也可以).std :: vector :: reserve()可以做到吗?做这样的事情是合法的:
std::vector<double> vec;
vec.reserve(N);
double *vecVal = vec.data();
#pragma OMP parallel for
for (size_i=0; i<N; ++i)
{
vecVal[i] = 0.;
}
/* do spMV */
Run Code Online (Sandbox Code Playgroud)
我怎样才能在std :: vector中设置正确的大小?
有谁知道更优雅的方式?
parallel当我在多台主机上运行相同命令时,是否可以在gnu输出的前面加上前缀?
我在一个工作池中有10台工作计算机,其中任何一台都可以接管工作,我想通过grep在所有日志文件中找出是哪个工作人员接管了:
parallel --nonall -S host1,host2,host3 grep job_id_123 /var/log/my_log.log
Run Code Online (Sandbox Code Playgroud)
打印类似:
initing job_id_123
doing phase1 job_id_123
doing phase2 job_id_123
wrapping up job_id_123
Run Code Online (Sandbox Code Playgroud)
我想要的是
host2: initing job_id_123
host2: doing phase1 job_id_123
host3: doing phase2 job_id_123
host1: wrapping up job_id_123
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
parallel --nonall -S host1,host2,host3 "hostname && grep job_id_123 /var/log/my_log.log"
Run Code Online (Sandbox Code Playgroud)
但是前缀是我所希望的。
我使用GNU parallel 20160422上Ubuntu precise (12.04.5 LTS)
看来打电话的时候
for i, Wi in enumerate(W.T):
idx.append(i)
result.append(pool.apply_async(ALS_Y, (X, Wi, Q, lambda_, n_factors, i,)))
Run Code Online (Sandbox Code Playgroud)
传递给函数的参数ALS_Y/ALS_X不是引用,它复制了参数.所以,当X或Y非常large matrixes,例如,在我的情况下,它是6000*40左右(并且它是a for-loop,让我们假设迭代次数是50 000,所以......) ,它超出了记忆的极限.
然后我尝试使用全局参数,只是将索引作为参数传递给函数,
import multiprocessing
import time
import numpy as np
def func(idx):
global a
a[idx] += 1
if __name__ == "__main__":
a=range(10)
for j in xrange(2):
pool = multiprocessing.Pool(processes=8)
result = []
for i in xrange(10):
result.append(pool.apply_async(func, (i, )))
pool.close()
pool.join()
print a
print "Sub-process(es) done."
Run Code Online (Sandbox Code Playgroud)
它输出:`
[0, …Run Code Online (Sandbox Code Playgroud)