openmp中parallel for处理双重循环遇到问题的分析和解决方案

本文详细探讨了在使用OpenMP的parallelfor进行双重循环时,如何因线程共享变量导致的数据不一致问题。通过实例和解决方法,揭示了设置线程数前声明变量的影响,并介绍了如何利用collapse和private关键字避免数据冲突。

写在前面

同学的程序遇到问题,主要是使用parallel for的双重循环,代码结果一直计算不对,但是一直没找到原因。后来发现原因挺简单的,就是在双重循环的时候,假如第一层是遍历 i,第二层是遍历 j,这个 j 如果是在omp_set_num_threads()之前声明的,就说明 j 被多个线程共用,那么可能这个线程正在使用 j,然后被另一个线程更改了。

omp parallel for

测试程序:

#include <omp.h>
#include <stdio.h>
using namespace std;

#define NUM_THREADS 2

int main()
{
    int i;
    printf("initila i address is %p\n", &i);
    
    omp_set_num_threads(NUM_THREADS);

    #pragma omp parallel for
    for (i = 0; i < 10; ++i)
    {
        printf("thread is %d, i=%d, i address is %p\n", 
                omp_get_thread_num(), i, &i);
    }

    return 0;
}

在开辟线程之前声明了 i,执行程序,结果如下:

initila i address is 0x7ffc060c5034
thread is 0, i=0, i address is 0x7ffc060c4fc4
thread is 0, i=1, i address is 0x7ffc060c4fc4
thread is 0, i=2, i address is 0x7ffc060c4fc4
thread is 0, i=3, i addres
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值