【问题标题】:C++ openmp on mac OS X El Capitan, Valgrind error (data race)Mac OS X El Capitan 上的 C++ openmp,Valgrind 错误(数据竞争)
【发布时间】:2017-06-17 06:40:29
【问题描述】:

我在我的 mac 上使用 opnemp 库在 C++ 下测试了一个简单的 helloword,通过终端使用以下两个命令:

/usr/local/bin/clang++-omp -fopenmp helloworld.cpp -o test
/usr/local/bin/valgrind  --tool=helgrind --log-file=a.log ./test

输出正确:

warning: no debug symbols in executable (-arch x86_64)
Hello World from thread = 0
Hello World from thread = 1
Hello World from thread = 3
Hello World from thread = 2
Number of threads = 4

但日志文件 (a.log) 包含:“来自 231 个上下文的 174986 个错误”(作为错误摘要)

这是日志文件的一部分:

==643== ---Thread-Announcement------------------------------------------
==643== 
==643== Thread #1 is the program's root thread
==643== 
==643== ----------------------------------------------------------------
==643== 
==643== Possible data race during read of size 4 at 0x10057C118 by thread #3
==643== Locks held: none
==643==    at 0x10055D1F4: spin_lock (in /usr/lib/system/libsystem_platform.dylib)
==643==    by 0x10057092D: _pthread_start (in /usr/lib/system/libsystem_pthread.dylib)
==643==    by 0x10056E384: thread_start (in /usr/lib/system/libsystem_pthread.dylib)
==643== 
==643== This conflicts with a previous write of size 4 by thread #1
==643== Locks held: none
==643==    at 0x10055D200: spin_unlock (in /usr/lib/system/libsystem_platform.dylib)
==643==    by 0x1000434B0: __kmp_create_worker (in /usr/local/Cellar/libiomp/20150701/lib/libiomp5.dylib)
==643==    by 0x100031E3D: __kmp_allocate_thread (in /usr/local/Cellar/libiomp/20150701/lib/libiomp5.dylib)
==643==    by 0x10002E7A1: __kmp_allocate_team (in /usr/local/Cellar/libiomp/20150701/lib/libiomp5.dylib)
==643==    by 0x10002FA2D: __kmp_fork_call (in /usr/local/Cellar/libiomp/20150701/lib/libiomp5.dylib)
==643==    by 0x100027F0D: __kmpc_fork_call (in /usr/local/Cellar/libiomp/20150701/lib/libiomp5.dylib)
==643==    by 0x100000CE8: main (in ./test)
==643==  Address 0x10057c118 is in the Data segment of /usr/lib/system/libsystem_pthread.dylib

“helloworld”的代码是:

#include <stdio.h>
#include <libiomp/omp.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {   
int nthreads=4, tid;
#pragma omp parallel num_threads(nthreads) private(tid)
 {

    //Obtain thread number
    tid = omp_get_thread_num();
    printf("Hello World from thread = %d\n", tid);

    // Only master thread does this
    if (tid == 0)
    {
        printf("Number of threads = %d\n", nthreads);
    }

 } 
return 0;
}

有人知道这些错误(数据竞争)吗?我在这些线程之间没有共享数据。

【问题讨论】:

  • 这绝对是误报。 libiomp 实现了 Valgrind 无法正确识别的自己的同步原语。毕竟,锁是使用不受保护但在硬件级别对共享变量的访问得到很好控制的实现的。

标签: c++ macos openmp valgrind


【解决方案1】:

这很可能是误报。例如,请参阅 similar discussion 以了解与 libgomp 相同的问题。这也可能是 libiomp / pthread 实现中的实际问题,但这似乎不太可能。

您似乎无能为力。一般来说,如果堆栈的顶部在库中,则要么是误报,要么是库中的错误,或者您正在滥用它(例如,在多个线程的缓冲区上运行 memcpy)。

如果您的二进制文件位于堆栈顶部,则更明显的是您的代码存在问题。

您的代码很好。数据竞赛。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多