OMP 2.0嵌套用于循环

时间:2016-08-11 09:27:43

标签: c multithreading openmp

由于我无法使用omp任务(使用visual studio 2015),我正在尝试找到嵌套循环任务的解决方法。代码如下:

#pragma omp parallel
    {
        for (i = 0; i < largeNum; i++)
        {
#pragma omp single
        {
            //Some code to be run by a single thread
            memset(results, 0, num * sizeof(results[0]));
        }
#pragma omp for
            for (n = 0; n < num; n++) {
                //Call to my function
                largeFunc(params[n], &resulsts[n])
            }
        }
#pragma omp barrier
    }

我希望我的所有线程都执行largeNum次,但是等待memset设置为零,然后我希望每个线程都执行largeFunc。我找不到任何数据依赖项。

在这一点上,我得到了omp指令在我脑海里乱七八糟的东西。这个解决方案有用吗?没有任务会有更好的方法吗?

谢谢, 阿里克

2 个答案:

答案 0 :(得分:1)

这段代码怎么样?

#pragma omp parallel private( i, n )
for ( i = 0; i < largeNum; i++ ) {
    #pragma omp for
    for ( n = 0; n < num; n++ ) {
        results[n] = 0;
        largeFunc( param[n], &results[n] );
    }
}

据我了解你的问题,如果single的实际类型支持赋值为0,则应该在不需要results指令的情况下处理初始化部分。此外,你的初始代码缺少private( i )声明。最后,不应该barrier

答案 1 :(得分:1)

为什么您希望所有线程都执行largeNUM?如果是的话,你是否依赖于你的largeFunc中的索引i

#pragma omp parallel for
    for (int i = 0; i < largeNum; i++)
    {
#pragma omp single
    {
        //Some code to be run by a single thread
        memset(results, 0, num * sizeof(results[0]));
    }
#pragma omp barrier

// #pragma omp for  -- this is not needed since it has to be coarse on the outermost level. However if the below function does not have anything to do with the outer loop then see the next example
        for (n = 0; n < num; n++) {
            //Call to my function
            largeFunc(params[n], &resulsts[n])
        }
    }

}

如果你不依赖我,那么

    for (i = 0; i < largeNum; i++)
    {
        //Some code to be run by a single thread
        memset(results, 0, num * sizeof(results[0]));

 #pragma omp parallel for
        for (int n = 0; n < num; n++) {
            //Call to my function
            largeFunc(params[n], &resulsts[n])
        }
    }

但是我觉得你想要第一个。通常,您在最外层循环上进行并行化。如果没有足够的工作要做,将pragma放在innerloop中会因代码开销而降低代码速度。