下面的代码不会运行超过一个线程。我尝试了以下方法,但没有成功(Visual Studio 2015 Update 3):
tried #pragma parallel
我不能得到一个以上的线程。
#include <iostream>
#include <omp.h>
int main(int argc, char* argv[])
{
int nb_threads = omp_get_max_threads();
printf(">> omp_get_max_thread()\n>> %i\n", nb_threads);
omp_set_num_threads(4);
printf(">> omp_set_num_threads(4)\n");
nb_threads = omp_get_num_threads();
printf(">> omp_get_num_threads()\n>> %i\n", nb_threads);
int id;
#pragma omp parallel
{
id = omp_get_thread_num();
printf(">> omp_get_thread_num()\n>> %i\n", id);
}
return 0;
}
输出为:
>> omp_get_max_thread()
>> 8
>> omp_set_num_threads(4)
>> omp_get_num_threads()
>> 1
>> omp_get_thread_num()
>> 0
发布于 2018-06-13 05:09:43
问题是您只有一个id
,而且对它的访问是序列化的。通过赋予每个线程对其自己的id
的访问权限,它们可以并行执行,因此我们希望将编译指示更改为:
#pragma omp parallel private(id)
这样,对id
的访问不会被序列化,每个线程都可以独立执行,因此我们得到如下输出:
>> omp_get_max_thread()
>> 4
>> omp_set_num_threads(4)
>> omp_get_num_threads()
>> 1
>> omp_get_thread_num()
>> 0
>> omp_get_thread_num()
>> 3
>> omp_get_thread_num()
>> 2
>> omp_get_thread_num()
>> 1
https://stackoverflow.com/questions/50825676
复制相似问题