Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用OPENMP的12个线程,使用总和缩减的速度仅为2倍_C_Multithreading_Openmp - Fatal编程技术网

C 使用OPENMP的12个线程,使用总和缩减的速度仅为2倍

C 使用OPENMP的12个线程,使用总和缩减的速度仅为2倍,c,multithreading,openmp,C,Multithreading,Openmp,我有一个代码片段,它是一维数组y[]上的和。我想使用omp for来加速它,我在一个12核节点上创建了12个线程来执行这个代码片段。当我测试时间时,结果表明,当我在单核(非并行)上执行此部分时,时间只有一半。任何人请给我一些指示,我如何可以加快这部分 我已尝试将计划更改为“引导式”,但无效 Da_re=Da_im=Db_re=Db_im=Na=Nb=0.0; #pragma omp parallel shared(Da_re,Da_im,Db_re,Db_im,Na,Nb,y,Ns) priva

我有一个代码片段,它是一维数组y[]上的和。我想使用
omp for
来加速它,我在一个12核节点上创建了12个线程来执行这个代码片段。当我测试时间时,结果表明,当我在单核(非并行)上执行此部分时,时间只有一半。任何人请给我一些指示,我如何可以加快这部分

我已尝试将计划更改为“引导式”,但无效

Da_re=Da_im=Db_re=Db_im=Na=Nb=0.0;
#pragma omp parallel shared(Da_re,Da_im,Db_re,Db_im,Na,Nb,y,Ns) private(sk)
{
#pragma omp for schedule(static) reduction(+:Da_re,Da_im,Db_re,Db_im,Na,Nb)
for(sk=0;sk<=16*(Ns-1);sk+=16) // the dimension for y[] is 16*Ns=16*803*803
    {
    Da_re += y[sk+0];   
    Da_im += y[sk+1];
    Db_re += y[sk+2];
    Db_im += y[sk+3];
    Na += y[sk+4]+y[sk+5];
    Nb += y[sk+6]+y[sk+7];
    }
}
Da_re=Da_im=Db_re=Db_im=Na=Nb=0.0;
#pragma omp并行共享(数据、数据、数据、数据、数据、数据、数据、数据)专用(sk)
{
#计划(静态)缩减的pragma omp(+:Da_re,Da_im,Db_re,Db_im,Na,Nb)

对于(sk=0;sk7毫秒太小了,无法作为一个有意义的度量。这就像是试图通过让两个女佣到城里去打扫壁橱来告诉他们哪一个清洁得更快。你所测量的只是开始工作然后停止工作的开销,而不是他们工作的实际时间。

实际时间是多少?仅仅告诉我们它的帮助是没有帮助的。从两分钟到一分钟与从100毫秒到50毫秒完全不同。@DavidSchwartz使用12个线程传递的时间是:3.461000毫秒,而使用一个线程传递的时间是:7.489000毫秒。那么我如何减少并行处理的时间?您假设这是程序不是一个理想的并行部分?我在做进化,这部分会一次又一次出现,所以我真的想把它变小。我怀疑如果我不使用缩减,而是使用其他方法,时间可能会变小。我是说这太小了,无法有效地并行。分配工作将花费太长时间k并合并结果。你需要并行化一个更大的块,否则你不会得到任何好处。好的,谢谢你的解释。事实上你是对的,当我去掉这个部分(不执行它)时,我的程序的总时间不会减少。