Я начал программировать около месяца назад, и недавно я пытался изучить многоядерную разработку с OpenMP в программах на C ++.Я не могу заставить OpenMP правильно работать для меня в большой программе, которую я написал.Я хочу выполнить следующий цикл параллельно.
for(int iAngle=0; iAngle<int(nAngles); iAngle++){
for(int k=0; k<int(nRadSamples); k++){
int x=coordX[k][iAngle];
int y=coordY[k][iAngle];
for(int i=yMin; i<int(yMax); i++){
int iy=i+y;
for(int j=xMin; j<int(xMax); j++){
response[iAngle][i][j] += inputSlice[iy][j+x];
}
}
}
}
координирование, координата, ответ и inputSlice равны
vector<vector<int> >
vector<vector<int> >
vector<vector<vector<float> > >
vector<vector<float> >
соответственно.При добавлении
#pragma omp parallel for
в качестве строки над этим циклом происходит значительное замедление (время выполнения 50 секунд замедляется до 75 секунд).
Я не думаю, что мои проблемы связаны с доступом к общим переменным response и inputSlice, потому что даже базовый код OpenMP странным образом выполняется в этой конкретной программе.Например, базовая программа
#include <stdio.h>
#include <omp.h>
int main() {
//////////////////////
#pragma omp parallel for
for(int i = 0; i<2; i++){
int thread = omp_get_thread_num() + 1 ;
int numThreads = omp_get_num_threads();
printf("Thread %d of %d printing %d\n", thread, numThreads,i);
}
////////////////////
return 0;
}
выводит
Thread 2 of 8 printing 1
Thread 1 of 8 printing 0
, но когда я копирую и вставляю код внутри границ ///////////////в функцию
int main(int argc, char* argv[])
моей большой программы она выводит
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Thread 1 of 1 printing 0
Thread 1 of 1 printing 1
Как будто каждый поток выполняет весь цикл for отдельно, не видя друг друга, что по понятным причинам замедлит мойвремя выполнения программы.'i' не было объявлено в области действия основной функции моей программы.
При компиляции моей программы я ссылаюсь на другие библиотеки, включая добавление -pthreads, -lguide и -ltiff в дополнение кfopenmp, при компиляции с gcc4.4.
Любая помощь с этой конкретной проблемой, или мой стиль кодирования в целом, будет принята с благодарностью!Я уже некоторое время стучу головой о клавиатуру.