gpt4 book ai didi

c++ - Qimage setPixel with openmp parallel for 不起作用

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

代码在没有并行的情况下工作,但是当我添加 pragma omp parallel 时,它不起作用。此外,如果我不添加 setPixel,代码将与 pragma omp parallel 完美配合。所以,我想知道为什么当我尝试在新图像中设置像素时并行性不能正常工作并以代码 255 退出程序。此代码想要更改图像,执行两次循环以使用高斯 vector 更改每个像素。有不明白的地方我会第一时间解决。

for (h = 0; h < height; h++){
QRgb* row = (QRgb*) result->scanLine(h);

//#pragma omp parallel for schedule(dynamic) num_threads(cores) private (j, auxazul, auxrojo, auxverde) reduction(+:red,green,blue)
for (w = 0; w < width; w++) {
red=green=blue=0;

minj = max((M-w),0);
supj = min((width+M-w),N);
for (j=minj; j<supj; j++){
auxazul = azul [w-M+j][h];
auxrojo = rojo [w-M+j][h];
auxverde = verde [w-M+j][h];

red += vectorGauss[j]*auxrojo;
green += vectorGauss[j]*auxverde;
blue += vectorGauss[j]*auxazul;
}

red /= 256; green /= 256; blue /= 256;
//result->setPixel(w,h,QColor(red,green,blue).rgba());
row[w] = QColor(red,green,blue).rgba();
}

最佳答案

QImage::setPixel 不是线程安全的,因为它调用了 detach() 方法(查看官方文档 here )。请记住 QImage 使用隐式共享

此外,setPixel() 极慢。如果您正在寻求性能(就像某些人在处理并行实现时通常做的那样),那不是最好的方法。

使用 scanLine() 就像您在提供的示例中所做的那样是正确的做法。

关于c++ - Qimage setPixel with openmp parallel for 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50360534/

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