以下代码不会运行多个线程。我尝试了以下但没有成功(Visual Studio 2015 Update 3):
我还没有能够获得多个帖子。
#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
答案 0 :(得分:2)
问题是您只有一个id
,并且序列化了对它的访问权限。通过让每个线程访问自己的id
,它们可以并行执行,因此我们希望将pragma更改为:
#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
答案 1 :(得分:0)
您应该使用编译器选项#pragma omp
在源代码中启用/openmp
。
如果编译中未指定
Scaffold-DbContext
,编译器将忽略OpenMP子句和指令。