我正在尝试学习如何使用 openmp 进行多线程处理。 这是我的代码:
#include <iostream>
#include <math.h>
#include <omp.h>
//#include <time.h>
//#include <cstdlib>
using namespace std;
bool isprime(long long num);
int main()
{
cout << "There are " << omp_get_num_procs() << " cores." << endl;
cout << 2 << endl;
//clock_t start = clock();
//clock_t current = start;
#pragma omp parallel num_threads(6)
{
#pragma omp for schedule(dynamic, 1000)
for(long long i = 3LL; i <= 1000000000000; i = i + 2LL)
{
/*if((current - start)/CLOCKS_PER_SEC > 60)
{
exit(0);
}*/
if(isprime(i))
{
cout << i << " Thread: " << omp_get_thread_num() << endl;
}
}
}
}
bool isprime(long long num)
{
if(num == 1)
{
return 0;
}
for(long long i = 2LL; i <= sqrt(num); i++)
{
if (num % i == 0)
{
return 0;
}
}
return 1;
}
问题是我希望 openmp 根据可用内核数自动创建多个线程。如果我取出 num_threads(6),那么它只使用 1 个线程,而 omp_get_num_procs() 正确输出 64。
我如何让它工作?
最佳答案
您没有提及您使用的是哪种编译器和 OpenMP 实现。我猜你正在使用其中一个,比如 PGI,它不会自动假设要在默认并行区域中创建的线程数,除非被要求这样做。由于您没有指定编译器,我不能确定这些选项是否真的能帮助您,但对于 PGI 的编译器,编译和链接可执行文件时必要的选项是 -mp=allcores
。添加后,它将导致系统为未指定线程数或未设置适当环境变量的并行区域的每个内核创建一个线程。
默认情况下,您从 omp_get_num_procs 获得的数字用于设置线程数量限制,但不一定是创建的数量。如果您想动态设置创建的数量,请在运行应用程序之前将环境变量 OMP_NUM_THREADS
设置为所需的数量,它应该会按预期运行。
关于c++ - Openmp 无法自动创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17199903/