Я работаю над кодом, который сравнивает гистограммы изображений, покупает вычисление корреляции, пересечения, 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 гистограммы доступны ввремя.
Протестировано на четырехъядерном компьютере
У меня есть небольшая неопределенность, при более длительной работе openmp, кажется, работает лучше, чем последовательный.Но если я сравниваю его только для одной гистограммы и измеряю время в секундах использования, то последовательный интерфейс работает примерно в 20 раз быстрее.
Я полагаю, что openmp вносит некоторую оптимизацию, как только увидит цикл for снаружи.Но в реальном решении между сравнениями гистограмм будет некоторый код, и я не уверен, будет ли он вести себя так же.