gpt4 book ai didi

c++ - OpenMP - 使用 parallel 在循环中调用函数,使用 Mat 对象

转载 作者:行者123 更新时间:2023-11-28 04:41:23 25 4
gpt4 key购买 nike

我有一个文本(大约 136.000 个字符),我想将它们写在一张图片中。我的文本存储在 vector 中,这意味着我可以使用循环 for 来更改像素的 low bit

这是函数更改最后一位:

int changeLastChar(int value, int newEnd) {
// change last decimal of an integer
if (newEnd > 9) return 1;
value /= 10;
value *= 10;
value += newEnd;
return value;
}

这个是写在图片里面的:

void writeTextToImage3(Mat& image, std::vector<char> message, int count) {
// write text to pixels by changing the last decimal in every RGB value
int ascii;
int row;
int col;


#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < message.size(); i++)
{

row = count/ image.cols;
col = count % image.cols;

ascii = message[i];
count++;


image.at<Vec3b>(row, col)[0] = changeLastChar(image.at<Vec3b>(row, col)[0], ascii % 10); // blue

ascii /= 10;
image.at<Vec3b>(row, col)[1] = changeLastChar(image.at<Vec3b>(row, col)[1], ascii % 10); // green

ascii /= 10;
image.at<Vec3b>(row, col)[2] = changeLastChar(image.at<Vec3b>(row, col)[2], ascii % 10); // red
}

}
}

我可以给出一些结果,如果我使用没有 OpenMP 的函数,它需要:0.29..

使用 OpenMP 使用 #pragma omp for:0.26..

使用 OpenMP 使用 #pragma omp parallel for:0.17..

我知道 forparallel for 之间的区别,如果我只使用 for ,我只有一个主线程,而不是一个组。

但至于我的问题:我需要每个 ascii 的确切 rowcol 数字。我看到了花时间的不同,我真的很喜欢看到 0.17..。但是.. 如果我清楚地理解,当我使用 parallel for 时:它会创建多个线程,并且迭代的每个部分都适用于多个线程的每个线程。好的。但是我不明白,为什么它只适用于第一次迭代而其他人不能继续改变位?

我的想法是:当某些部分(不是第一个,某些..)工作时,它计算一个变量cout++,它计算行和列。当然,它从 0 开始计数,但我需要从 0 开始计数 THE FIRST THREAD ,而不是某些部分。这就是为什么如果我不使用 parallel ,它会以正确的顺序运行,因为它只有一个主线程。

你能帮忙吗?我能以正确的方式使用 parallel for 吗?

最佳答案

count在所有线程之间共享,你会得到一个竞争条件,因为它是在每个循环中写入的。您还会在局部变量上获得竞争条件,这些变量应该在循环内而不是在循环外声明(这样每个线程都会有自己的拷贝)。

您已经拥有 icount 时递增确实如此,所以你可以使用它。不要修改 count , 改变你的 rowcol计算使用 counti :

int row = (count + i) / image.cols;
int col = (count + i) % image.cols;
int ascii = message[i];

您也可以直接调用 image.at<Vec3b>(row, col)一次,将结果存储在一个变量中,然后使用它:

auto &v = image.at<Vec3b>(row, col);

v[0] = changeLastChar(v[0], ascii % 10);
// etc.

关于c++ - OpenMP - 使用 parallel 在循环中调用函数,使用 Mat 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50123791/

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