我有一个C ++类库,它使用omp进行并行化。我注意到我的问题,它总是耗尽我的处理器上的所有核心,而不是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的Hello 来自主题2的你好 来自主题1的你好 来自主题3的你好
我必须认为这与项目类型或项目中的某些参数有关。有谁知道它可能是什么?
祝你好运 理查德
答案 0 :(得分:0)
OMP没有义务以任何方式并行化您的代码。它可能很好地判断这种短代码是无意义的并行化 - 特别是因为printf不包含线程保证并且以并行方式执行阻塞工作是一种反模式。处理线程时,这样的短片段从不表示任何事情。
答案 1 :(得分:0)
我现在解决了这个问题,所以这个帖子可以关闭,除非有人能回答为什么会这样,解释如下:
我遇到的问题是我的C ++项目属性页中的属性Common Language Runtime Support被设置为No Common Language Runtime Support。我们对此进行了更改,因为Visual Studio 2010不支持将此设置设置为“公共语言运行时支持”的C ++应用程序的intellisense。但是,如上所述,似乎需要设置线程才能工作。
任何人都知道为什么?
祝你好运 理查德