2016-11-10 3 views
0

Решение, которое этот параллельный возврат не соответствует решению, которое оно должно быть возвращено, например, нераспарализованное.Параллелирование цикла в C++ с помощью OpenMP

double angle=(PI/180)*atoi(extra); 
    unsigned int xf; 
    unsigned int yf; 
    int j;  
    #pragma omp parallel for private (j,xf,yf)   
    for(int i=0;i<width;i++){ 
     for(j=0;j<height;j++){ 
      xf=(unsigned int)ceil(((cos(angle)*(j-(((double)height)/2.0)))-(sin(angle)*(i-(((double)width)/2.0))))+(((double)height)/2.0)); 
      yf=(unsigned int)ceil(((sin(angle)*(j-(((double)height)/2.0)))+(cos(angle)*(i-(((double)width)/2.0))))+(((double)width)/2.0)); 
      if(xf<(unsigned int)height && xf>=0 && yf>=0 && yf<(unsigned int)width){ 
        matrixRed2[yf][xf]=matrixRed[i][j]; 
        matrixGreen2[yf][xf]=matrixGreen[i][j]; 
        matrixBlue2[yf][xf]=matrixBlue[i][j]; 
      } 
     } 
    } 
+1

Я не уверен, что полностью соблюдаю ваш код, но это не выглядит так, как если бы значения y '' '' '' '' '' '' '' '' '' '' были бы разными, когда потоки будут вычислять их. –

ответ

0

Я не видеть, что это необходимо для J, чтобы быть вне цикла, так как он просто содержит временное значение перед назначением на массив (которые имеют элемент, не зависящий). Более того, два цикла могут быть свернуты. Отредактировано: каждый xf, yf не является гарантией быть уникальным по формуле из i, j. Так что держите последовательный, или вы можете попытаться проверить, чтобы сохранить наибольшее (i, j), если есть условие гонки в (xf, yf). Я не уверен, что OpenMP может работать на Visual Studio или нет, так как поддерживаемая версия очень старая (в то же время последняя версия - 4.5).

+0

Решение, которое делает это, еще не работает – giorgioW

+0

@giorgioW Что значит «не работает»? Результат неверен? Время не сокращается? –

+2

@ khôinguyễn Я не думаю, что ваш ответ правильный. Представьте себе ситуацию, когда две разные пары '(i, j)' производят одни и те же пары (yf, xf) ". Затем в непараллельной версии матрица 'matrixColor2' будет удерживать последний раз, когда будет создана пара' (yf, xf). В параллельной версии у вас будут потоки, толкающиеся друг над другом в этой матрице, поэтому результат не определен. К OP: Я не считаю, что эта программа может быть адаптирована параллельно как есть. По своей сути это последовательная операция. – NoseKnowsAll

Смежные вопросы