假阳性;“冲突负荷”;用DRD? 分析我的C++代码与DRD(ValGRD)发现了一个“冲突的负载”,但我看不出原因。代码如下: int* x; int Nt = 2; x = new int[Nt]; omp_set_num_threads(Nt); #pragma omp parallel for for (int i = 0; i < Nt; i++) { x[i] = i; } for (int i = 0; i < Nt; i++) { printf("%d\n", x[i]); }

假阳性;“冲突负荷”;用DRD? 分析我的C++代码与DRD(ValGRD)发现了一个“冲突的负载”,但我看不出原因。代码如下: int* x; int Nt = 2; x = new int[Nt]; omp_set_num_threads(Nt); #pragma omp parallel for for (int i = 0; i < Nt; i++) { x[i] = i; } for (int i = 0; i < Nt; i++) { printf("%d\n", x[i]); },c++,openmp,valgrind,race-condition,C++,Openmp,Valgrind,Race Condition,GNU OpenMP运行时(libgomp)使用线程池实现OpenMP线程团队。创建线程后,线程停靠在屏障上,等待被唤醒以执行特定任务。在GCC中,这些任务以概述(内联的相反)代码段的形式出现,即并行区域(或显式OpenMP任务)的代码被提取到单独的函数中,并作为任务提供给一些等待的线程以供执行。然后提升对接屏障,线程开始执行任务。一旦完成,线程将再次停靠-它们不会连接,只是简单地挂起。因此,从DRD的角度来看,在并行区域之后执行代码串行部分的主线程正在访问可能被其他线程写入的保护资源。这当然不

GNU OpenMP运行时(
libgomp
)使用线程池实现OpenMP线程团队。创建线程后,线程停靠在屏障上,等待被唤醒以执行特定任务。在GCC中,这些任务以概述(内联的相反)代码段的形式出现,即并行区域(或显式OpenMP任务)的代码被提取到单独的函数中,并作为任务提供给一些等待的线程以供执行。然后提升对接屏障,线程开始执行任务。一旦完成,线程将再次停靠-它们不会连接,只是简单地挂起。因此,从DRD的角度来看,在并行区域之后执行代码串行部分的主线程正在访问可能被其他线程写入的保护资源。这当然不会发生,因为其他线程已停靠并等待新任务


这种误报常见于DRD等不理解OpenMP特定语义的通用工具。因此,这些工具不适合分析OpenMP程序。您应该使用专门的工具,例如Sun/Oracle Solaris Studio for Linux的免费线程分析器或商用Intel Inspector。后者可以在获得许可证的情况下免费用于非商业开发目的。这两种工具都了解OpenMP的细节,不会出现诸如可能的数据竞争之类的情况。

您可以尝试使用std::threads来制定程序吗?这可能会澄清发生了什么,因为并不是每个人都确切知道omp当时在做什么。另外,使用与真实测试用例匹配的行号的确切DRD错误也很方便。我从未使用std::threads,但我编辑了我的帖子并包含了DRD错误。。。我希望这有帮助!在我看来,drd似乎认为该地址受到某个互斥锁的保护,但在printf中,它是在不持有该互斥锁的情况下访问的。这在我看来也是一样,但我不明白为什么该地址应该受到保护,当并行部分在printf.DRD之前完成时,很可能无法推断出还有其他一些同步将您的程序置于一种状态,即它只能从一个线程内访问该数组,因此它告诉您它以前受到过保护,而这次没有。
==2369== Conflicting load by thread 1 at 0x06031034 size 4
==2369==    at 0x4008AB: main (test.c:47)
==2369== Address 0x6031034 is at offset 4 from 0x6031030. Allocation context:
==2369==    at 0x4C2DCC7: operator new[](unsigned long) (vg_replace_malloc.c:363)
==2369==    by 0x400843: main (test.c:37)
==2369== Other segment start (thread 2)
==2369==    at 0x4C31EB8: pthread_mutex_unlock (drd_pthread_intercepts.c:703)
==2369==    by 0x4C2F00E: vgDrd_thread_wrapper (drd_pthread_intercepts.c:236)
==2369==    by 0x5868D95: start_thread (in /lib64/libpthread-2.15.so)
==2369==    by 0x5B6950C: clone (in /lib64/libc-2.15.so)
==2369== Other segment end (thread 2)
==2369==    at 0x5446846: ??? (in /usr/lib64/gcc/x86_64-pc-linux-gnu/4.7.3/libgomp.so.1.0.0)
==2369==    by 0x54450DD: ??? (in /usr/lib64/gcc/x86_64-pc-linux-gnu/4.7.3/libgomp.so.1.0.0)
==2369==    by 0x4C2F014: vgDrd_thread_wrapper (drd_pthread_intercepts.c:355)
==2369==    by 0x5868D95: start_thread (in /lib64/libpthread-2.15.so)
==2369==    by 0x5B6950C: clone (in /lib64/libc-2.15.so)