c - OMP 2.0 嵌套 For 循环

标签 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 指令在我脑海中的所有内容。这个解决方案有效吗?没有任务有更好的方法吗?

谢谢!

最佳答案

仅这段代码呢?

#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] );
    }
}

据我了解您的问题,如果 results 的实际类型支持分配,则无需 single 指令即可处理初始化部分到 0。此外,您的初始代码缺少 private( i ) 声明。最后,应该不需要 barrier

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

相关文章:

multithreading - 使用 ThreadPool.GetAvailableThreads 来限制服务执行的工作量是否可以接受?

c - pragma omp for 没有性能

c# - 在linux上用c代码调用c#代码的最佳方法是什么

objective-c - 开发人员在 Objective-C 中使用 C 函数是否有技术原因

c# - 方法调用超时

c++ - OpenMP:同一编译指示上的 nowait 和 reduction 子句

c++在派生函数中启动OMP线程

c - 为什么 GetComputerNameEx 没有用数据填充缓冲区

linux - lib(libmicrohttp-dev)中 "client callback"的概念

java - 在不定期检查 Activity 状态的情况下杀死线程