由于我无法使用 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 指令都混在了我的脑海里。这个解决方案有效吗?没有任务有没有更好的方法?

谢谢!

最佳答案

仅此代码呢?

#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 指令的情况下处理,前提是 results 的实际类型支持赋值为 0。此外,您的初始代码缺少 private( i ) 声明。最后,应该不需要 barrier

关于c - OMP 2.0 嵌套 For 循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38892404/

10-12 16:08