Я пытаюсь распараллелить простой цикл, используя OpenMP. Ниже мой код:
#include <iostream>
#include <omp.h>
#include <time.h>
#define SIZE 10000000
float calculate_time(clock_t start, clock_t end) {
return (float) ((end - start) / (double) CLOCKS_PER_SEC) * 1000;
}
void openmp_test(double * x, double * y, double * res, int threads){
clock_t start, end;
std::cout << std::endl << "OpenMP, " << threads << " threads" << std::endl;
start = clock();
#pragma omp parallel for num_threads(threads)
for(int i = 0; i < SIZE; i++){
res[i] = x[i] * y[i];
}
end = clock();
for(int i = 1; i < SIZE; i++){
res[0] += res[i];
}
std::cout << "time: " << calculate_time(start, end) << std::endl;
std::cout << "result: " << res[0] << std::endl;
}
int main() {
double *dbl_x = new double[SIZE];
double *dbl_y = new double[SIZE];
double *res = new double[SIZE];
for(int i = 0; i < SIZE; i++){
dbl_x[i] = i % 1000;
dbl_y[i] = i % 1000;
}
openmp_test(dbl_x, dbl_y, res, 1);
openmp_test(dbl_x, dbl_y, res, 1);
openmp_test(dbl_x, dbl_y, res, 2);
openmp_test(dbl_x, dbl_y, res, 4);
openmp_test(dbl_x, dbl_y, res, 8);
delete [] dbl_x;
delete [] dbl_y;
delete [] res;
return 0;
}
Я компилирую, как показано ниже
g++ -O3 -fopenmp main.cpp -o ompTest
Однако после запуска теста на Core-i7 у меня получаются следующие результаты:
OpenMP, 1 поток
время: 31.468
результат: 3.32834e + 12
OpenMP, 1 поток
время: 18.663
результат: 3.32834e + 12
OpenMP, 2 потока
время: 34,393
результат: 3.32834e + 12
OpenMP, 4 потока
время: 56,31
результат: 3.32834e + 12
OpenMP, 8 потоков
время: 108,54
результат: 3.32834e + 12
Я не понимаю, что я делаю не так? Почему OpenMP замедляет вычисления?
А также, почему первый результат значительно медленнее, чем второй (оба с 1-ным потоком)?
Моя тестовая среда: Core i7-4702MQ CPU @ 2,20 ГГц, Ubuntu 18.04.2 LTS, g ++ 7.4.0.