C OpenMP-无错误共享的阵列插入

C OpenMP-无错误共享的阵列插入,c,caching,parallel-processing,openmp,false-sharing,C,Caching,Parallel Processing,Openmp,False Sharing,我正在使用C语言中的OpenMP来并行化我的程序。我的程序中有一个部分将计算值插入数组。代码如下所示: #pragma omp parallel for 对于(i=0;i首先,错误共享是一个性能问题,而不是正确性问题。对于所有数据访问,您不必不惜一切代价避免错误共享,但对于大多数数据访问,您应该避免错误共享 您的简单循环模式没有问题。您可以使用实现的默认模式。如果需要,您可以使用计划(静态)-除非指定块大小,否则OpenMP将仅为每个线程分配一个大块。这意味着您最多有两条缓存线(边界)每个线程

我正在使用C语言中的OpenMP来并行化我的程序。我的程序中有一个部分将计算值插入数组。代码如下所示:

#pragma omp parallel for

对于(i=0;i首先,错误共享是一个性能问题,而不是正确性问题。对于所有数据访问,您不必不惜一切代价避免错误共享,但对于大多数数据访问,您应该避免错误共享

您的简单循环模式没有问题。您可以使用实现的默认模式。如果需要,您可以使用
计划(静态)
-除非指定块大小,否则OpenMP将仅为每个线程分配一个大块。这意味着您最多有两条缓存线(边界)每个线程都会受到错误共享的影响。从统计上来说,这无关紧要

从尽可能大的块大小开始是一个很好的默认值。仅当您出于其他原因(例如负载平衡)而减少块大小时,您必须小心不要获得太多的错误共享。将块大小保持为2的幂的倍数通常是一个好主意

您应该注意以下模式:

data[omp_get_thread_num()] = ...;

这很容易导致错误共享。您应该避免在相邻存储小的每线程数据的位置全局分配数据。

这可能会导致错误共享,但不一定会这样。OpenMP可能会自行将循环迭代分配给块中的线程。即使它这样做时不考虑特定的字符系统硬件的特点是,任何分块都会减少错误共享的负面影响。实际上,我的程序将在128核的超级计算机上运行,因此我将有多达256个线程。有这么多线程,我想每个线程都会有一小部分分块。这应该是个问题,对吗?在这种情况下,你不需要这样做担心错误共享,而不是担心线程创建/管理开销。这种开销比具有错误共享的单个缓存线影响更大。为了超过开销成本,每个线程始终需要一定大小的工作负载。
data[omp_get_thread_num()] = ...;