OpenMP使用了令人惊讶的大量核心

时间:2017-10-29 16:36:12

标签: c++ openmp

我正在尝试并行化for循环。 大致是:

#pragma omp parallel
{
#pragma omp for
    for(int i=0;i<count;++i){
        some_heavy_function_call()
    }
}

使用count=2进行调试和测试。 some_heay_function_call()有 没有进一步的并行性。

我希望核心数量为2。 但操作系统(Ubuntu)说程序使用8个线程(我的系统最多)。

该函数被调用2次,问题似乎不是我做错了循环。

我的假设是错误的,应该使用最多2个线程吗? 如果不是可能会发生什么?

更新: 我不清楚。我不奇怪会产生8个线程。我想知道所有都有接近100%的负载。遗憾。

更新2: 如果我使用gdb调试并切换线程,我在2个线程中找到函数调用,在其他线程中找到:

(gdb) #1  0x00007ffff6267e22 in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
(gdb) #2  0x00007ffff6b176da in start_thread (arg=0x7ffff2fc0700) at pthread_create.c:456
456 pthread_create.c: Datei oder Verzeichnis nicht gefunden.
(gdb) #3  0x00007ffff5d7bd7f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:105
105 ../sysdeps/unix/sysv/linux/x86_64/clone.S: Datei oder Verzeichnis nicht gefunden.

Datei oder Verzeichnis nicht gefunden表示找不到文件或目录。

1 个答案:

答案 0 :(得分:0)

OpenMP通常会使用与核心一样多的线程。如果你有更好的想法,请自己设定数字。

{
    omp_set_num_threads(2);
    #pragma omp parallel for
    for(int i=0;i<count;++i){
        some_heavy_function_call();
    }
}