在OpenMP中连接数组结果

Jos*_*ose 2 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);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法改善上面代码的性能?

Wal*_*ter 6

好的,我终于明白了你想做什么.是的,你使用与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
}
Run Code Online (Sandbox Code Playgroud)

但同时进行聚合也很重要.