В последние месяцы я работал с компьютерными матричными умножениями и провел несколько тестов с использованием openMP и eigen3.
Испытания проводились на следующих машинах:
Компьютер 1:
ЦП Intel Core i7-3610QM с тактовой частотой 2,30 ГГц / 6 ГБ ddr3
Компьютер 2:
Шестиядерный процессор AMD Opteron(tm) 2435 2,60 ГГц (2 процессора) / 16 ГБ
Для openMP использовался следующий алгоритм умножения матрицы на матрицу:
void matrix4openmp(void)
{
int j;
#pragma omp parallel for
for (j=0;j<N; j+=2){
double v1[N],v2[N];
int i,k;
for (i=0;i<N; i++){
v1[i]=b[i][j];
v2[i]=b[i][j+1];
}
for (i=0; i<N;i+=2){
register double s00,s01,s10,s11;
s00=s01=s10=s11=0.0;
for (k=0;k<N;k++){
s00 += a[i] [k] * v1[k];
s01 += a[i] [k] * v2[k];
s10 += a[i+1][k] * v1[k];
s11 += a[i+1][k] * v2[k];
}
c[i] [j] =s00;
c[i] [j+1] =s01;
c[i+1][j] =s10;
c[i+1][j+1] =s11;
}
}
Результаты были следующими:
_________________________Компьютер 1__________Компьютер 2
Последовательный________232,75600___________536,21400
OpenMP____________2,75764____________7,62024
Собственный 3_____________3,35090____________1,92970
*Время указано в секундах.
*Размеры матрицы были 2700 х 2500 и 2500 х 2700.
*Последовательные алгоритмы отличаются от OMP, это самая простая версия m-m умножения, которую можно увидеть здесь: http://pastebin.com/Pc9AKAE8.
* Инструкции SSE2 были активированы для тестов eigen3.
* OpenMP использует ядра по умолчанию, это все ядра, обнаруженные Windows, включая виртуальные.
Как видите, версия OpenMP работает быстрее на первом компьютере (i7), чем версия eigen3. Однако для компьютера 2 (2x Opteron) производительность eigen3 полностью превосходит версию OpenMP плюс все тесты, проведенные на компьютере 1.
Есть идеи, почему я получаю такие результаты и почему eigen3 не так быстр на компьютере 1, как на компьютере 2?
taskset
). - person Steve-o   schedule 10.12.2012