gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:50 26 4
gpt4 key购买 nike

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

现在我已经使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com