C++ OpenMP/C++;如何使openMP循环以可变大小递增

C++ OpenMP/C++;如何使openMP循环以可变大小递增,c++,openmp,C++,Openmp,我正在尝试使用openMP读取图像。图像很大(32141*17453),我想分块阅读。我对openMP非常陌生,不确定它是否能解决问题。我不确定的是 1) 我可以像j+=chunksize那样递增吗 2) 我可以给线程不同的块来处理吗 3) 如果我不能进行分块处理,必须在高度和宽度之间循环,我如何存储如此庞大的数据。我曾尝试使用向量向量,但这不是最佳解决方案 请帮忙 我已经尝试让代码正常工作,但结果不正确。但是,如果我在ReadImagePixelChunkWise周围加上一个锁,我会得到结果,

我正在尝试使用openMP读取图像。图像很大(32141*17453),我想分块阅读。我对openMP非常陌生,不确定它是否能解决问题。我不确定的是

1) 我可以像j+=chunksize那样递增吗

2) 我可以给线程不同的块来处理吗

3) 如果我不能进行分块处理,必须在高度和宽度之间循环,我如何存储如此庞大的数据。我曾尝试使用向量向量,但这不是最佳解决方案

请帮忙

我已经尝试让代码正常工作,但结果不正确。但是,如果我在ReadImagePixelChunkWise周围加上一个锁,我会得到结果,但它会序列化执行。如果有一个关键的代码反馈,那么我就可以知道我到底做错了什么

#pragma omp parallel shared(nHeight,nWidth,nColorBands) 
private(id,chunksize,i,j,k)
{
    id = omp_get_thread_num();
    for(i=0;i<nColorBands;i++)
    {
        float *fPixelBlockData = new float[nWidth];
#pragma omp for
        for(j=0;j<nHeight;j+=chunksize)
        {
            ReadImagePixelChunkWise(fPixelBlockData);
        }
    }
}
#pragma omp并行共享(右侧、右侧、右侧)
私有(id、chunksize、i、j、k)
{
id=omp_get_thread_num();

对于(i=0;i您提出了错误的问题。正确的问题是:是
ReadImagePixelChunkWise
threadsafe。从界面和您的问题来看,答案是:可能不是。因此,如果不深入研究您在问题中没有提供的函数,那么并行化代码是没有用的。您在哪里阅读图像从?读取速度比处理器速度更可能成为瓶颈。嗨,祖兰,感谢您的洞察力。ReadImagePixelChunkWise是我们使用的API,但我们没有代码访问权限。该API看起来有点像ReadImagePixelChunkWise(读取标志、块大小、宽度、要填充的数据);我在这里所做的是在串行代码中将一大块行作为blocksize和整个宽度传递。它所做的是返回我的数据,并用所有像素值填充。如果图像甚至没有句柄,它可能仍然不是线程安全的。在任何情况下-猜测是错误的-请参阅此专有函数的文档或联系提供有关线程安全问题的信息。您使用的API函数可能会从文件中按顺序读取块。如果您同时从两个或多个线程调用它,则很可能会返回垃圾,因为I/O调用将重叠。支持并行读取的函数通常要求为每个操作提供偏移量不要像顺序读取那样依赖文件指针。你问的问题是错误的。正确的问题是:
ReadImagePixelChunkWise
threadsafe。从界面和你的问题来看,答案是:可能不是。因此,如果不深入研究函数,并行化代码是没有用的——你已经知道了we’在问题中未提供。您从何处读取图像?读取速度比处理器速度更可能是瓶颈。嗨,祖兰,感谢您的洞察力。ReadImagePixelChunkWise是我们使用的API,但我们没有代码访问权限。该API看起来有点像ReadImagePixelChunkWise(读取标志、块大小、宽度、要填充的数据);我在这里所做的是在串行代码中将一大块行作为blocksize和整个宽度传递。它所做的是返回我的数据,并用所有像素值填充。如果图像甚至没有句柄,它可能仍然不是线程安全的。在任何情况下-猜测是错误的-请参阅此专有函数的文档或联系提供有关线程安全问题的信息。您使用的API函数可能会从文件中按顺序读取块。如果您同时从两个或多个线程调用它,则很可能会返回垃圾,因为I/O调用将重叠。支持并行读取的函数通常要求为每个操作提供偏移量并且不像顺序读取那样依赖文件指针。
for(j=0;j<nHeight;j++)
{
    omp_set_lock(&lck);
    ReadImagePixelBlockAPI(fPixelBlockData);
    omp_unset_lock(&lck);
}