相关疑难解决方法(0)

如何确保动态分配的数组在openmp中是私有的

我在Linux机器上使用gcc使用openMP在C中工作.在openmp并行for循环中,我可以将静态分配的数组声明为private.考虑代码片段:

int a[10];
#pragma omp parallel for shared(none) firstprivate(a)
for(i=0;i<4;i++){
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.但如果相反我动态分配,

int * a = (int *) malloc(10*sizeof(int));
#pragma omp parallel for shared(none) firstprivate(a)
Run Code Online (Sandbox Code Playgroud)

a(至少a [1 ... 9])的值不受保护,但就好像它们是共享的一样.这是可以理解的,因为pragma命令中的任何内容似乎都没有告诉omp需要私有的数组a有多大.我怎样才能将这些信息传递给openmp?如何将整个动态分配的数组声明为私有?

c malloc parallel-processing openmp

12
推荐指数
2
解决办法
3万
查看次数

并行减少CPU上的数组

有没有办法在C/C++中并行减少CPU上的数组?我最近了解到使用openmp是不可能的.还有其他选择吗?

c c++ parallel-processing tbb openmp

3
推荐指数
1
解决办法
2897
查看次数

在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)

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

c++ arrays multithreading openmp

2
推荐指数
1
解决办法
5256
查看次数

标签 统计

openmp ×3

c ×2

c++ ×2

parallel-processing ×2

arrays ×1

malloc ×1

multithreading ×1

tbb ×1