c++ - Openmp 无法自动创建线程

标签 c++ multithreading openmp

我正在尝试学习如何使用 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/

相关文章:

用于插入模板映射的 C++ 函数

c++ - 当您将位移超出变量的末尾时会发生什么?

c++ - 我怎样才能直观地看到 RSU 的范围?

multithreading - 偶尔使用jmeter进行重复请求

c - 为什么这段代码不运行?

c++ - 该指针不同于调用该方法的指针

c - OpenMP time 和 clock() 给出了两个不同的结果

c++ - Daemonize 保持 C++ ostream 打开

c - 使用 openmp 任务的部分并行循环

c++ - 在 OpenMP 中加入数组结果