c++ - 在 OpenMP 中加入数组结果

标签 c++ arrays multithreading openmp

我正在使用 OpenMP 编写 C++ 代码。我有一个全局巨大数组(100,000 多个元素),将通过在 for 循环中添加值来修改它。有没有一种方法可以有效地让 OpenMP 创建的每个线程并行维护其本地数组拷贝,然后在循环后加入?由于线程数是一个变量,我无法事先创建数组的本地拷贝。如果使用全局拷贝并通过同步锁解决竞争条件,性能会很糟糕。

谢谢!

编辑: 抱歉不清楚。下面是一些伪代码,希望可以阐明这种情况:

int* huge_array=new int[N];
memset(huge_array, 0, N*sizeof(int));
#pragma omp parallel for
for (i=0; i<n; i++)
{
  get a value v independently
  get a position p independently
  // I have to set a lock here
  omp_set_lock(&lock);
  huge_array[p] += v;
  omp_unset_lock(&lock);
}

有没有办法提高上面代码的性能?

最佳答案

好吧,我终于明白你想做什么了。是的,您的操作方式与 ptreads 相同。

std::vector<int> A(N,0);
std::vector<int*> local(omp_max_num_threads());
#pragma omp parallel
{
  int np = omp_get_num_threads();
  std::vector<int> localA(N);
  local[omp_get_thread_num()] = localA.data();

  // add values to local array
  #pragma omp for
  for(int i=0; i<num_values; ++i)
    localA[position()] += value();          // (1)
  // implicit barrier ensures all local copies are ready for aggregation

  // aggregate local copies into global array
  #pragma omp for
  for(int k=0; k<N; ++k)
    for(int p=0; p<np; ++p)
       A[k] += local[p][k];                 // (2)
  // implicit barrier ensures no local copy is deleted before aggregation is done
}

但并行进行聚合也很重要。

关于c++ - 在 OpenMP 中加入数组结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18773757/

相关文章:

c++ - LLVM 项目的示例 CMakeLists.txt 文件

c# - 发布/订阅架构

java - 多线程扩展面板

c++ - 在 cmake 中添加库列表

c++ - OSX 10.7 上的 clock() 和 CLOCKS_PER_SEC

javascript - 将两个数组组合并合并为 Highchart Pie 的数组集

c - 如何找到数组的大小(从指向数组第一个元素的指针)?

java - 从 2D JSON 对象读取数据

ios - 多个 AVPlayer 实例同时暂停会导致短暂但烦人的卡住

c++ - glUniform1ui 的成本