我正在努力解决并行文件读取方面相当棘手的(我猜)问题。
现在我已经使用 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/