LINUX.ORG.RU

OpenMP + ARM Linux нет увеличения скорости for loop

 , , ,


0

1

Здравствуйте! Подскажите пожалуйста почему при подключении openmp не удается уменьшить время работы программы.

Плата imx8 с Cortex A53

Содержимое файла main.cpp

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
#include <math.h>
#include <time.h>
#include <omp.h>

#define CHANNELS 4
using namespace std;
using namespace cv;

int main()
{
    cout << "Start programm" << endl;

    vector<Mat>      matrix_1(CHANNELS);
    vector<Mat>      matrix_2(CHANNELS);
    vector<Mat>      result(CHANNELS);
    Mat rnd_image = Mat(2048, 2048, CV_32FC1, Scalar(0));
    // matrix initialization

    clock_t start, end;
    double cpu_time_used;
	
	for (int i = 0; i < CHANNELS; i++) {
        randn(rnd_image, Scalar(0), Scalar(16000));
        rnd_image.copyTo(matrix_1[i]);
        randn(rnd_image, Scalar(0), Scalar(16000));
        rnd_image.copyTo(matrix_2[i]);
	}
	
	start = clock();
    for (int i = 0; i < CHANNELS; i++) {
        multiply(matrix_1[i], matrix_2[i], result[i]);
    }
    end = clock();
    cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;

    cout << "Time taken by for_loop: " << cpu_time_used << " seconds " << endl;
	
    start = clock();
	
	#pragma omp parallel num_threads(2)
	for (int i = 0; i < CHANNELS; i++) {
		multiply(matrix_1[i], matrix_2[i], result[i]);
	}

    end = clock();
    cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;

    cout << "Time taken by for_loop with openmp: " << cpu_time_used << " seconds " << endl;
    return 0;
}

Команда для компиляции (флаг -fopenmp добавлен)

g++ main.cpp -fopenmp -I /usr/include/opencv2 -L /usr/lib -lopencv_core

Прописал переменную

root@imx8m-var-dart:~/test# printenv OMP_NUM_THREADS
2
root@imx8m-var-dart:~/test#

Компилирую и запускаю программу

root@imx8m-var-dart:~/test# ./a.out
Start programm
Time taken by for_loop: 0.930273 seconds
Time taken by for_loop with openmp: 1.83559 seconds
root@imx8m-var-dart:~/test#

По идее время на выполнение должно быть в два раза меньше... Что делаю не так?



Последнее исправление: Alexey_Rostov (всего исправлений: 1)
	#pragma omp parallel num_threads(2)
	for (int i = 0; i < CHANNELS; i++) {
		randn(rnd_image, Scalar(0), Scalar(16000));
		rnd_image.copyTo(matrix_1[i]);
		randn(rnd_image, Scalar(0), Scalar(16000));
		rnd_image.copyTo(matrix_2[i]);
		multiply(matrix_1[i], matrix_2[i], result[i]);
	}

Тетя не смущает что rnd_image - общая переменная для всех потоков?

AlexVR ★★★★★
()
	#pragma omp parallel for num_threads(2)
	for (int i = 0; i < CHANNELS; i++) {
		multiply(matrix_1[i], matrix_2[i], result[i]);
	}

for в прагме

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Смущало, исправил, вынес инициализацию за for, проблема осталась

Alexey_Rostov
() автор топика

multiply(matrix_1[i], matrix_2[i], result[i]);

А ты уверен, что OpenCV сам не пытается здесь задействовать потоки?

AlexVR ★★★★★
()
Последнее исправление: AlexVR (всего исправлений: 1)
Ответ на: комментарий от Alexey_Rostov

На Windows …

А сколько времени занимает без OpenMP?

gag ★★★★★
()

Если убрать openmp совсем:

Start programm
Time taken by for_loop: 0.026331 seconds 
Time taken by for_loop with openmp: 0.019906 seconds 
iamweasel
()

Всем спасибо! Ответ очень прост: некорректное измерение времени с использованием функции clock.Функция выдает суммарное время по ВСЕМ потокам. Исправленный код с правильным измерением временных интервалов

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
#include <math.h>
#include <time.h>
#include <omp.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>

#define CHANNELS 4
using namespace std;
using namespace cv;

static double dtime(){
    double t;
    struct timeval tv;
    gettimeofday(&tv, NULL);
    t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
    return t;
}

int main()
{
    cout << "Start programm" << endl;

    vector<Mat>      matrix_1(CHANNELS);
    vector<Mat>      matrix_2(CHANNELS);
    vector<Mat>      result(CHANNELS);
    Mat rnd_image = Mat(2048, 2048, CV_32FC1, Scalar(0));
    // matrix initialization

for (int i = 0; i < CHANNELS; i++) {
	randn(rnd_image, Scalar(0), Scalar(16000));
	rnd_image.copyTo(matrix_1[i]);
	randn(rnd_image, Scalar(0), Scalar(16000));
	rnd_image.copyTo(matrix_2[i]);
}
	
	double start = dtime();
for (int i = 0; i < CHANNELS; i++) {
	multiply(matrix_1[i], matrix_2[i], result[i]);
}

	cout << "Time taken by for_loop: " << dtime() - start << " seconds " << endl;
	start = dtime();

#pragma omp parallel for num_threads(2)
	for (int i = 0; i < CHANNELS; i++) {
		multiply(matrix_1[i], matrix_2[i], result[i]);
	}

	cout << "Time taken by for_loop with openmp: " << dtime() - start  << " seconds " << endl;
    return 0;
}

Вывод консоли

root@imx8m-var-dart:~/test# ./a.out
Start programm
Time taken by for_loop: 0.058367 seconds
Time taken by for_loop with openmp: 0.0297861 seconds
root@imx8m-var-dart:~/test#

Alexey_Rostov
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.