gpt4 book ai didi

c++ - 带有 For 循环和指针操作的 OPENMP

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

上下文

我正在做一个 directshow 滤镜,它可以改变每一帧的对比度和亮度。指向第一帧第一个像素的指针是:RGBTRIPLE *prgb = (RGBTRIPLE*) pData;

此外,int numPixels = cxImage * cyImage; 是每帧的像素数。

循环

#pragma omp parallel for
for (int iPixel=0; iPixel < numPixels; iPixel++ ) {

prgb->rgbtGreen = prgb->rgbtGreen * _contrastPower + _brightnessPower;
prgb->rgbtBlue = prgb->rgbtBlue * _contrastPower + _brightnessPower;
prgb->rgbtRed = prgb->rgbtRed * _contrastPower + _brightnessPower;

if(prgb->rgbtGreen>255) prgb->rgbtGreen = 255;
if(prgb->rgbtBlue>255) prgb->rgbtBlue = 255;
if(prgb->rgbtRed>255) prgb->rgbtRed = 255;


prgb++;
}

问题

输出流是丑陋的。假设我们必须让线程使用我们递增的相同指针,当然它们最终会竞速并导致奇怪的问题。

此外,我尝试删除 int iPixel 并仅使用 prgb*,但无法理解语法。

问题

是否可以在使用指针操作的同时进行并行循环?如果是,怎么办?

最佳答案

问题是 prgb 是一个共享指针,在没有任何数据保护的情况下在每个线程中递增它会导致数据竞争。相反,您的代码应类似于以下内容:

#pragma omp parallel for schedule(static)
for (int iPixel=0; iPixel < numPixels; iPixel++ ) {
RGBTRIPLE *ppixel = prgb + iPixel;

ppixel->rgbtGreen = ppixel->rgbtGreen * _contrastPower + _brightnessPower;
ppixel->rgbtBlue = ppixel->rgbtBlue * _contrastPower + _brightnessPower;
ppixel->rgbtRed = ppixel->rgbtRed * _contrastPower + _brightnessPower;

if(ppixel->rgbtGreen>255) ppixel->rgbtGreen = 255;
if(ppixel->rgbtBlue>255) ppixel->rgbtBlue = 255;
if(ppixel->rgbtRed>255) ppixel->rgbtRed = 255;
}

该算法在现代 CPU 上受内存限制,因此如果图像数据不能完全放入 CPU 缓存,不要指望性能与线程数成线性比例。

关于c++ - 带有 For 循环和指针操作的 OPENMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26537966/

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