这是我的测试代码
void test_code() {
omp_set_num_threads(4);
#pragma omp parallel
{
int tid = omp_get_thread_num();
#pragma omp for
for (int i = 0; i < 4; i++)
printf("Hello World %d %d\n", tid, i);
}
}
...
void CResizer::ThreadMain()
{
test_code();
MLINFO(ObjectName(), "%s started\n", __FUNCTION__);
CBufferMonitor bufResize("Resizer (frames):", ObjectId());
...结果应该是
你好世界1 1你好世界3 3你好世界2 2世界0 0
但我的结果是
你好世界0 0 1你好世界0 1你好世界0 2你好世界0 0 1世界0 2你好世界0 2你好世界0 3你好世界0 0 2世界0 3你好世界0 0 0世界0 0 3世界0 0世界0 0 0世界0 0 0世界0 0 0世界0 0 01世界0 2你好世界0 3你好世界0 2你好世界0 3
你知道为什么会这样吗?我的系统有8个核心cpu,centos 7.5。
发布于 2021-06-19 03:18:29
首先,我想强调的是,您提供的信息(代码示例)不足以回答这个问题,但是猜测正在发生什么是可能的。
我认为唯一可能的解释是,#pragma omp parallel区域在test_code()函数中只能使用一个线程(例如,因为没有更多可用的线程,或者您的代码位于嵌套并行区域内,并且不允许嵌套并行),因此tid始终是0。此外,test_code() (即CResizer::ThreadMain())由8个线程执行,因此打印输出重复了8次。基于您的函数名(ThreadMain),这似乎是一个合理的解释,但正如我所提到的,如果没有一个最小的工作示例,就不可能确切地说明这一点。不管怎么说,我希望这能帮你找到问题。
为了给出一个例子,下面的代码将产生类似于您发送的输出:
#include <stdio.h>
#include <omp.h>
void test_code() {
omp_set_num_threads(4);
#pragma omp parallel
{
int tid = omp_get_thread_num();
#pragma omp for
for (int i = 0; i < 4; i++)
printf("Hello World %d %d\n", tid, i);
}
}
int main() {
#pragma omp parallel
test_code();
}发布于 2021-06-17 07:24:35
查看OpenMP快速参考卡,您创建了“一个执行该区域的OpenMP线程团队”。所有的OpenMP规范都可以找到这里。
即使您多次执行并行部分,输出仍然看起来是错误的。这是因为i是跨所有线程共享的。此外,还不清楚为什么要用std::mutex包围一个并行部分,该部分将其标识为C++代码。您还可以从#pragma语句中设置并行部分中的线程数。因此,以下可能就足够了:
#pragma omp parallel
{
const int tid = omp_get_thread_num();
#pragma omp for
for (int i = 0; i < 4; i++)
printf("Hello World %d %d\n", tid, i);
}https://stackoverflow.com/questions/68011894
复制相似问题