Met*_*est 2 c linux gcc x86-64 openmp
我有一个具有以下结构的代码.
#pragma omp parallel for
for( i = 0; i < N; i++ )
{
.....
index = get_index(...);
array[index] = ...;
.....
}
Run Code Online (Sandbox Code Playgroud)
现在index每个线程的值都是唯一的(它永远不会为不同的线程重叠),但是当然OpenMP无法猜测这个,我想是使用同步对象来访问array.
我怎么能要求openmp不要使用同步对象,array并依赖我,这个index值对于不同的线程是唯一的.我试图放入array私人列表,但是因此出现了分段错误.
Openmp确实在障碍或隐含障碍下同步.例如,for除非指定了nowait子句,否则构造末尾会有隐式屏障.
但是openmp不会通过访问来同步内存.相反,它为每个线程提供共享和私有内存块的机制.
在您的情况下,index需要是私人的.否则,每个线程写入相同的内存位置,当您访问时,您将遇到竞争条件array[index].
为了演示,我明确设置了行为,虽然i默认情况下是私有的,默认情况下是array共享的.
#pragma omp parallel for private(i, index) shared(array)
for( i = 0; i < N; i++ )
{
.....
index = get_index(...);
array[index] = ...;
.....
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |