0

我有大量的整数集,我又将它们放入指针向量中。我需要能够在不引起竞争条件的情况下并行更新这些整数集。进一步来说。我正在使用 OpenMP 的“parallel for”构造。

为了处理共享资源,OpenMP 提供了一个方便的“原子指令”,它允许人们在不使用锁的情况下避免对特定内存块的竞争条件。如果我可以使用“原子指令”来防止同时更新我的​​整数集会很方便,但是,我不确定这是否可能。

基本上,我想知道以下代码是否会导致竞争条件

vector< set<int>* > membershipDirectory(numSets, new set<int>);

#pragma omp for schedule(guided,expandChunksize)
for(int i=0; i<100; i++)
  {
    set<int>* sp = membershipDirectory[rand()];
    #pragma omp atomic
      sp->insert(45);
  }

请注意,我使用随机整数作为索引,因为在我的应用程序中,任何线程都可能访问任何索引(在我较大的应用程序中有一个随机元素,但我不需要详细说明)。

我已经看到了一个用于递增 integer 的类似示例,但我不确定它在使用指向容器的指针时是否有效,就像我的情况一样。

4

3 回答 3

2

经过一番搜索,我在 openmp.org 上找到了OpenMP C 和 C++ API 手册,并在第 2.6.4 节中描述了原子构造的局限性。

基本上,原子指令只能与以下运算符一起使用:

一元:++、--(前缀和后缀)

二进制:+,-,*,/,^,&,|,<<,>>

所以我只会使用锁!

(在某些情况下,临界区可能更可取,但在我的情况下,锁将提供对共享资源的细粒度访问,从而产生比临界区更好的性能。)

于 2010-04-22T12:09:06.410 回答
1

你不应该在表达式是函数调用的地方使用原子,它只适用于简单的表达式(可能内置:幂,平方根)。

而是使用关键部分(命名或默认)

于 2010-04-25T17:47:04.090 回答
0

你的代码不清楚。假设membershipDirectory[5] 实际上是membershipDirectory[i],则不需要原子指令。例如,对于两个处理器,OpenMP 产生两个线程,一个处理 i = 0-49,另一个处理 50-99 个间隔。在这种情况下,不需要保护membershipDirectory[i]。atomic 指令用于保护一些不依赖于循环索引的公共资源,例如总和。

于 2010-04-22T11:40:22.053 回答