c - OpenMP - 使用线程不同的起始编号制作数组计数器

标签 c parallel-processing openmp

我正在努力解决并行文件读取方面相当棘手的(我猜)问题。

现在我已经使用 mmap 映射了文件,我希望它读取值并将其放入三个数组中。好吧,也许解释不是很清楚,所以这是我当前的代码:

        int counter = header;

        #pragma omp parallel for shared (red,green,blue,map) private (i,j) firstprivate(counter)
        for(i = 0; i < x; i++)
        {
               for(j = 0; j < y; j++)
               {
                    red[i][j] = map[counter];
                    green[i][j] = map[counter+1];
                    blue[i][j] = map[counter+2];
                    counter+=3;
               }

        }

header 是文件的开头 - 只是图像相关信息,例如大小和一些注释。

这里的问题是,该计数器必须是私有(private)的。我发现困难的是想出在具有不同起始编号的线程之间划分计数器。

谁能告诉我如何实现它?

最佳答案

如果我正确理解了您的代码,您可以将计数器保留为共享变量并将对其的更新包含在单个部分中,例如

blue[i][j] = map[counter+2];
#pragma omp single 
{
  counter+=3;
}
}

我写类似的东西是因为我没有仔细检查语法,也没有考虑single 指令的一些可选子句的有用性。我怀疑这可能会真正拖累性能。

另一种方法是从根本上重新排序你的循环嵌套,也许(同样没有仔细检查):

    #pragma omp parallel shared (red,green,blue,map) private (i,j) 
    #pragma for collapse(2) schedule(hmmm, this needs some thought)
    for(counter = 0; counter < counter_max; counter += 3)
    {
        for(i = 0; i < x; i++)
        {
               for(j = 0; j < y; j++)
               {
                    red[i][j] = map[counter];
               }

        }
    }
    ... loop for blue now ...
    ... loop for green now ...

请注意,在此版本中,OpenMP 会将前两个循环折叠到一个迭代空间中,我预计这将提供比未折叠循环更好的性能,但值得通过试验来弄清楚这一点。可能还值得尝试使用 schedule 子句。

关于c - OpenMP - 使用线程不同的起始编号制作数组计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21033061/

相关文章:

c - printf 的相同代码,不同的输出?

c# - Parallel.ForEach 的不同求和结果

c++ - 使用openMP的多线程两个功能

c - 在 c11 中支持 BitSet

c - 在 C 中为 char 数组赋值不起作用

java - 从另一个 java 进程调用 java 使其停止

c - 更新二维数组时相邻元素的依赖性 (OpenMP)

c++ - 打开 : check if nested parallesim

根据伪代码实现的 C 中的计数排序但无法正常运行

R with parallel & pls - 如何处理 Windows 中的非终止 Rscript 进程