Multithreading 使用openmp崩溃处理可能的线程数 int-DIMENSION=4,totalPair=0; #pragma omp并行专用(sx、dy、dx) 对于(sy=0;syaddreduce(+:totalPair)到每个pragmaThanks获取答案。实际
使用openmp崩溃处理可能的线程数Multithreading 使用openmp崩溃处理可能的线程数 int-DIMENSION=4,totalPair=0; #pragma omp并行专用(sx、dy、dx) 对于(sy=0;syaddreduce(+:totalPair)到每个pragmaThanks获取答案。实际,multithreading,nested,openmp,Multithreading,Nested,Openmp,使用openmp崩溃处理可能的线程数 int-DIMENSION=4,totalPair=0; #pragma omp并行专用(sx、dy、dx) 对于(sy=0;syaddreduce(+:totalPair)到每个pragmaThanks获取答案。实际上,我的目标是确保所有线程都在每个值上运行一次(使用特定的组合(sy=0,sx=0,dy=0,dx=0),假设分配给线程0)因此,使用collapse,是否有可能使线程重叠(sy=0,sx=0,dy=0,dx=0),同时分配给两个线程)。使用r
int-DIMENSION=4,totalPair=0;
#pragma omp并行专用(sx、dy、dx)
对于(sy=0;syaddreduce(+:totalPair)
到每个pragmaThanks获取答案。实际上,我的目标是确保所有线程都在每个值上运行一次(使用特定的组合(sy=0,sx=0,dy=0,dx=0),假设分配给线程0)因此,使用collapse,是否有可能使线程重叠(sy=0,sx=0,dy=0,dx=0),同时分配给两个线程)。使用reduce,我无法在本例中进行检查。但是,它给出了256的正确答案。如果希望所有线程都执行相同的任务,请不要使用for
构造。此构造将单个循环的迭代分布在线程之间,当使用collapse`(collapse(2))时,它将扩展到多个循环
将仅并行化sx
和sy
维度。如果希望所有线程分别生成totalPair=256
,则使用单个#pragma omp parallel
。在您的示例中,您的程序具有竞争条件(循环的结果不确定),这是使用reduce
指令解决的。另一个问题出现了,我发现collapse适用于最多16个嵌套循环。在16个嵌套循环中,此子句以0次迭代运行所有循环。
int DIMENSION = 4, totalPair = 0;
#pragma omp parallel for private(sx,dy,dx)
for(sy=0; sy<DIMENSION; sy++)
for(sx=0; sx<DIMENSION; sx++)
for(dy=0; dy<DIMENSION; dy++)
for(dx=0; dx<DIMENSION;dx++){
totalPair++;
}
int DIMENSION = 4, totalPair =0;
#pragma omp parallel for collapse(4) private(dx)
for(sy=0; sy<DIMENSION; sy++)
for(sx=0; sx<DIMENSION; sx++)
for(dy=0; dy<DIMENSION; dy++)
for(dx=0; dx<DIMENSION;dx++){
totalPair++;
}
int DIMENSION = 4, totalPair =0;
#pragma omp parallel for collapse(2) private(dy,dx)
for(sy=0; sy<DIMENSION; sy++)
for(sx=0; sx<DIMENSION; sx++)
for(dy=0; dy<DIMENSION; dy++)
for(dx=0; dx<DIMENSION;dx++){
totalPair++;
}