我有一个使用 omp 进行并行化的 C++ 类库。我注意到我的问题,因为它总是用完我处理器上的所有内核,不管 omp_set_num_threads(threadCount) 有什么作为输入。
所以在进行调查时,我意识到让 num_threads 工作的唯一方法是不使用 omp_set_num_threads() 方法,而是像这样在并行指令上设置 num_threads:
#pragma omp parallel num_threads(4)
{
int i = omp_get_thread_num();
printf_s("Hello from thread %d\n", i);
}
在上面的例子中,输出是:
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
如果我改为使用以下内容:
omp_set_num_threads(4);
#pragma omp parallel //num_threads(4)
{
int i = omp_get_thread_num();
printf_s("Hello from thread %d\n", i);
}
输出是
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
但是,我创建了一个类型为 Win32 控制台应用程序的新项目,omp_set_num_threads 有效并且我得到了输出:
来自线程 0 的问候 来自线程 2 的问候 来自线程 1 的问候 来自线程 3 的问候
我不得不认为这与项目类型或项目上的某些参数有关。有谁知道它可能是什么?
最好的问候 理查德
最佳答案
我现在解决了这个问题,所以这个线程可以关闭,除非有人能回答为什么会这样,解释如下:
我遇到的问题是我的 C++ 项目属性页中的属性公共(public)语言运行时支持设置为无公共(public)语言运行时支持。我们更改了此设置,因为 visual studio 2010 不支持将此设置设置为“公共(public)语言运行时支持”的 C++ 应用程序的智能感知。但似乎需要设置才能使线程工作,正如我上面所解释的那样。
有人知道为什么吗?
最好的问候 理查德
关于c++ - omp_set_num_threads 总是返回 0 并且我无法使用 omp_get_thread_num() 获取线程号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4087852/