сравнение гистограммы openMP - PullRequest
3 голосов
/ 31 июля 2011

Я работаю над кодом, который сравнивает гистограммы изображений, покупает вычисление корреляции, пересечения, ChiSquare и несколько других методов.Общий вид этих функций очень похожи друг на друга.

Обычно я работаю с pthreads, но на этот раз я решил создать небольшой прототип с openMP (из-за его простоты) и посмотреть, какие результаты я получу.

Это пример сравнения по корреляции, код идентичен последовательной реализации, за исключением одной строки цикла openMP.

double comp(CHistogram* h1, CHistogram* h2){

    double Sa = 0;
    double Sb = 0;
    double Saa = 0;
    double Sbb = 0;
    double Sab = 0;

    double a, b;
    int N = h1->length;

    #pragma omp parallel for reduction(+:Sa,Sb,Saa,Sbb,Sab) private(a ,b)
    for (int i = 0; i<N;i++){
        a =h1->data[i];
        b =h2->data[i];

        Sa+=a;
        Sb+=b;
        Saa+=a*a;
        Sbb+=b*b;
        Sab+=a*b;

    }

    double sUp = Sab - Sa*Sb / N;
    double sDown = (Saa-Sa*Sa / N)*(Sbb-Sb*Sb / N);

    return sUp / sqrt(sDown);
}

Есть ли еще способы ускорить эту функцию с помощью openMP?

Спасибо!

PS: я знаю, что самым быстрым способом было бы просто сравнить разные пары гистограмм в нескольких потоках, но это не применимо к моей ситуации, так как только 2 гистограммы доступны ввремя.

Протестировано на четырехъядерном компьютере Results Vertical time horisontal iterations over histogram of length 255

У меня есть небольшая неопределенность, при более длительной работе openmp, кажется, работает лучше, чем последовательный.Но если я сравниваю его только для одной гистограммы и измеряю время в секундах использования, то последовательный интерфейс работает примерно в 20 раз быстрее.

Я полагаю, что openmp вносит некоторую оптимизацию, как только увидит цикл for снаружи.Но в реальном решении между сравнениями гистограмм будет некоторый код, и я не уверен, будет ли он вести себя так же.

1 Ответ

2 голосов
/ 02 августа 2011

OpenMp требуется некоторое время для настройки параллельной области. Эти издержки означают, что вы должны быть осторожны, чтобы накладные расходы не превышали производительность, получаемую при настройке параллельной области. В вашем случае это означает, что только когда N достигнет определенного числа, openMP ускорит вычисления.

Вам следует подумать о способах уменьшения общего количества вызовов openMP, например, возможно ли установить параллельный регион вне этой функции, чтобы вы могли сравнивать разные гистограммы параллельно?

...