gpt4 book ai didi

c++ - 使用 openmp 并行计算 for 循环

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:24 27 4
gpt4 key购买 nike

我有一个二维图像,我想在其中计算所有颜色并将结果存储在一个数组中。我知道颜色的数量,所以我可以在之前设置数组的大小。我现在的问题是计数对我来说持续时间太长。如何使用 OpenMP 加快计数?
我当前的序列号是

std::vector<int> ref_color_num_thread;
ref_color_num.resize(ref_color.size());
std::fill(ref_color_num.begin(), ref_color_num.end(), 0);
ref_color_num_thread.resize(ref_color.size());
std::fill(ref_color_num_thread.begin(), ref_color_num_thread.end(), 0);

for (int i = 0; i < image.width(); i++)
{
for (int j = 0; j < image.height(); j++)
{
for (int k = 0; k < (int)ref_color.size(); k++)
{
if (image(i, j, 0, 0) == ref_color[k].R && image(i, j, 0, 1) == ref_color[k].G && image(i, j, 0, 2) == ref_color[k].B)
ref_color_num_thread[k]++;
}
}
}

第一种方法是在每个循环(每次尝试另一个)设置 #pragma omp parallel for,但每次我都会因为错误的内存访问而导致程序崩溃。我必须为我的 vector 使用 private() 吗?

最佳答案

您正在做的是填充颜色的直方图。这等同于使用 OpenMP 在 C/C++ 中进行数组缩减。在 C/C++ 中,OpenMP 没有内置对此的支持(但它在 Fortran 中支持,因为数组大小在 Fortran 中是已知的,而在 C/C++ 中它仅对静态数组已知)。但是,使用 OpenMP 自己在 C/C++ 中进行数组缩减很容易。

#pragma omp parallel 
{
std:vector<int> ref_color_num_thread_private(ref_color.size(),0);
#pragma omp for
for (int i = 0; i < image.width(); i++) {
for (int j = 0; j < image.height(); j++) {
for (int k = 0; k < (int)ref_color.size(); k++) {
if (image(i, j, 0, 0) == ref_color[k].R && image(i, j, 0, 1) == ref_color[k].G && image(i, j, 0, 2) == ref_color[k].B)
ref_color_num_thread_private[k]++;
}
}
}
#pragma omp critical
{
for(int i=0; i<(int)ref_color.size(); i++) {
ref_color_num_thread[i] += ref_color_num_thread_private[i];
}
}
}

我在这里详细介绍了他 Fill histograms (array reduction) in parallel with OpenMP without using a critical section

我展示了如何在没有关键部分的情况下进行数组缩减,但这要棘手得多。您应该首先测试第一种情况,看看它是否适合您。只要颜色数 (ref_color.size()) 与像素数相比较小,它就应该很好地并行化。否则,您可能需要在没有关键部分的情况下尝试第二种情况。

关于c++ - 使用 openmp 并行计算 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003784/

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