OpenMP / C ++ Как получить цикл openMP для увеличения на переменный размер - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь прочитать изображение, используя openMP. Изображение большое (32141 * 17453), и я хочу прочитать его по кусочкам. Я очень новичок в openMP и не уверен, что он может решить проблему. В чем я не уверен, так это ..

1) Могу ли я увеличить как j + = chunksize?

2) Могу ли я дать потокам разные чанки для обработки.

3) Если я не могу обработать по частям, и мне приходится проходить циклически по высоте и ширине, как мне хранить такие огромные данные. Я пытался использовать вектор векторов, но это не оптимальное решение.

Пожалуйста, помогите.

Я пытался заставить код работать, но результаты не верны. Однако, если я поставлю блокировку вокруг ReadImagePixelChunk, то я получу результат, но он сериализует выполнение. Это действительно помогло бы получить критическую обратную связь кода, поэтому я может узнать, что я делаю действительно неправильно.

#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);
        }
    }
}

Код не работает правильно, но когда я делаю что-то вроде ...

for(j=0;j<nHeight;j++)
{
    omp_set_lock(&lck);
    ReadImagePixelBlockAPI(fPixelBlockData);
    omp_unset_lock(&lck);
}

Работает корректно. Поперечное чтение работает с сериализацией, но отставание в производительности слишком велико. На компьютере с процессором Intel i5 3.20 Ghz 8 Gb Ram это занимает около 5-6 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...