Я пытаюсь прочитать изображение, используя 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 минут.