相关疑难解决方法(0)

在对数时间内平行减少

给定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)

c algorithm parallel-processing reduce openmp

15
推荐指数
1
解决办法
1447
查看次数

OpenMP:深度优先搜索的良好策略

我正在编写一个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任务的更新版本,具有更快的顺序性能和良好的并行化.

c++ parallel-processing openmp

5
推荐指数
1
解决办法
933
查看次数

标签 统计

openmp ×2

parallel-processing ×2

algorithm ×1

c ×1

c++ ×1

reduce ×1