简体   繁体   English

关键部分的功能在OpenMP中产生数据竞争

[英]Functions in critical sections produce data races in OpenMP

I seem to have a serious lack of understanding of OpenMP concerning the use of critical inside a parallel region. 对于在并行区域内使用critical,我似乎对OpenMP缺乏足够的了解。 My question is simple: Why does the code below produce warnings with valgrind drd? 我的问题很简单:为什么下面的代码会用valgrind drd产生警告?

#include <stdio.h>
#include <unistd.h>

void A(int* a)
{
   printf("a++\n");
   (*a)++;
}

void B(int* a)
{
   printf("a--\n");
   (*a)--;
}

void f(int* a)
{
#pragma omp critical
   A(a);

   sleep(1); /* work done here */

#pragma omp critical
   B(a);
}

int main(int argc, char** argv)
{
   int i;
   int a = 0;

#pragma omp parallel for
   for(i = 0; i < 4; ++i)
   {
      f(&a);
   }

   return 0;
}

It is compiled it with: 它使用以下命令进行编译:

gcc -fopenmp -g -o omptest omptest.c

And the valgrind call is valgrind调用是

valgrind --tool=drd  --check-stack-var=yes ./omptest

My understanding was that critical sections should protect me from exactly the warning I get. 我的理解是关键部分应该保护我免受我收到的警告的打击。 I spend 2 days now trying to figure out the error but I don't find it. 我现在花了2天的时间来找出错误,但找不到。 It would be very nice if someone could give me a hint on what exactly I didn't understand. 如果有人能给我一些我不明白的提示,那将非常好。

Any help is appreciated. 任何帮助表示赞赏。

EDIT: The (repeating) warning on my 2 CPU machine is: 编辑:我的2 CPU机器上的(重复)警告是:

Thread 2:
Conflicting load by thread 2 at 0x7fefffecc size 4
   at 0x4007DE: A (omptest.c:7)
   by 0x40082E: f (omptest.c:19)
   by 0x400902: main._omp_fn.0 (omptest.c:35)
   by 0x4E45EE9: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
   by 0x4C2D9E1: ??? (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
   by 0x5053E99: start_thread (pthread_create.c:308)
   by 0x535B39C: clone (clone.S:112)
Allocation context: unknown.
Other segment start (thread 1)
   at 0x4C2DF29: pthread_create@* (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
   by 0x4E4631B: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
   by 0x400889: main (omptest.c:32)
Other segment end (thread 1)
   at 0x5326F1D: ??? (syscall-template.S:82)
   by 0x5326DBB: sleep (sleep.c:138)
   by 0x40083D: f (omptest.c:21)
   by 0x400902: main._omp_fn.0 (omptest.c:35)
   by 0x400895: main (omptest.c:32)

Conflicting store by thread 2 at 0x7fefffecc size 4
   at 0x4007E7: A (omptest.c:7)
   by 0x40082E: f (omptest.c:19)
   by 0x400902: main._omp_fn.0 (omptest.c:35)
   by 0x4E45EE9: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
   by 0x4C2D9E1: ??? (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
   by 0x5053E99: start_thread (pthread_create.c:308)
   by 0x535B39C: clone (clone.S:112)
Allocation context: unknown.
Other segment start (thread 1)
   at 0x4C2DF29: pthread_create@* (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
   by 0x4E4631B: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
   by 0x400889: main (omptest.c:32)
Other segment end (thread 1)
   at 0x5326F1D: ??? (syscall-template.S:82)
   by 0x5326DBB: sleep (sleep.c:138)
   by 0x40083D: f (omptest.c:21)
   by 0x400902: main._omp_fn.0 (omptest.c:35)
   by 0x400895: main (omptest.c:32)

Thread 1:
Conflicting load by thread 1 at 0x7fefffecc size 4
   at 0x400805: B (omptest.c:13)
   by 0x40084E: f (omptest.c:24)
   by 0x400902: main._omp_fn.0 (omptest.c:35)
   by 0x400895: main (omptest.c:32)
Allocation context: unknown.
Other segment start (thread 2)
   at 0x535B361: clone (clone.S:84)
Other segment end (thread 2)
   at 0x5326F1D: ??? (syscall-template.S:82)
   by 0x5326DBB: sleep (sleep.c:138)
   by 0x40083D: f (omptest.c:21)
   by 0x400902: main._omp_fn.0 (omptest.c:35)
   by 0x4E45EE9: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
   by 0x4C2D9E1: ??? (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
   by 0x5053E99: start_thread (pthread_create.c:308)
   by 0x535B39C: clone (clone.S:112)

Conflicting store by thread 1 at 0x7fefffecc size 4
   at 0x40080E: B (omptest.c:13)
   by 0x40084E: f (omptest.c:24)
   by 0x400902: main._omp_fn.0 (omptest.c:35)
   by 0x400895: main (omptest.c:32)
Allocation context: unknown.
Other segment start (thread 2)
   at 0x535B361: clone (clone.S:84)
Other segment end (thread 2)
   at 0x5326F1D: ??? (syscall-template.S:82)
   by 0x5326DBB: sleep (sleep.c:138)
   by 0x40083D: f (omptest.c:21)
   by 0x400902: main._omp_fn.0 (omptest.c:35)
   by 0x4E45EE9: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
   by 0x4C2D9E1: ??? (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
   by 0x5053E99: start_thread (pthread_create.c:308)
   by 0x535B39C: clone (clone.S:112)

I understand the warning as a data race on a, line 7 and 13 are the (*a)-- and (*a)++ calls. 我理解警告,因为第7行和第13行上的数据争用是(* a)-和(* a)++调用。

I was just reading through the documentation of drd, in particular section 8.2.8: 我只是在阅读drd的文档 ,特别是第8.2.8节:

DRD supports OpenMP shared-memory programs generated by GCC. DRD支持GCC生成的OpenMP共享内存程序。 GCC supports OpenMP since version 4.2.0. 从4.2.0版开始,GCC支持OpenMP。 GCC's runtime support for OpenMP programs is provided by a library called libgomp. GCC对OpenMP程序的运行时支持由一个名为libgomp的库提供。 The synchronization primitives implemented in this library use Linux' futex system call directly, unless the library has been configured with the --disable-linux-futex option. 除非已使用--disable-linux-futex选项配置了库,否则在此库中实现的同步原语直接使用Linux的futex系统调用。 DRD only supports libgomp libraries that have been configured with this option and in which symbol information is present. DRD仅支持使用此选项配置的libgomp库,并且其中存在符号信息。 For most Linux distributions this means that you will have to recompile GCC. 对于大多数Linux发行版,这意味着您必须重新编译GCC。 See also the script drd/scripts/download-and-build-gcc in the Valgrind source tree for an example of how to compile GCC. 另请参见Valgrind源代码树中的脚本drd / scripts / download-and-build-gcc,以获取有关如何编译GCC的示例。 You will also have to make sure that the newly compiled libgomp.so library is loaded when OpenMP programs are started. 您还必须确保在启动OpenMP程序时加载了新编译的libgomp.so库。

If you didn't recompile libgomp this could be a possible explanation of the odd behavior you are encountering. 如果您不重新编译libgomp则可能是您遇到的奇怪行为的一种可能解释。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM