2016-05-06 3 views
1

я делаю тест о производительности OpenMP, бушель я найти какие-то странные результаты, вот мой тестовый код:Производительность OpenMP

void test() 
{ 
int a = 0; 
clock_t t1 = clock(); 
int length =50000; 
double *t3 = new double[length](); 
double *t4 = new double[length](); 
for (int i = 0; i <8000; i++) 
{ 
for (int j = 0; j < length; j++) 
    { 
     t3[j] = t3[j] + t4[j]; 
    } 
} 
clock_t t2 = clock(); 
printf("Time = %d %d\n", t2 - t1,omp_get_thread_num()); 
delete[] t3; 
delete[] t4; 
} 

int main() 
{ 
clock_t t1 = clock(); 
printf("In parallel region:\n"); 
#pragma omp parallel for 
for (int j = 0; j < 8; j++) 
{ 

    test(); 
} 

clock_t t2 = clock(); 
printf("Total time = %d\n", t2 - t1); 
printf("In sequential region:\n"); 
test(); 
printf("\n"); 

}

когда я установить length=50000 или length=100000 или length=150000 соответственно, результаты показали на рисунке: enter image description here

странно, что

  • Истекшее время не является прямой линией (прошедшее время, когда length=150000 почти в 5 раз больше, чем при length=50000), а сумма вычислений - прямая линия вверх.
  • также странно, что прошедшее время для тестовой функции в параллельной области не совпадает с прошедшим временем для тестовой функции в последовательной области, когда length=150000.

мой центральный процессор Intel Core i5-4590 (4 ядра) и платформа vs2013, win8

Я готов надеюсь кто-нибудь может сказать мне причину и как решить эту проблему, чтобы улучшить производительность спасибо, спасибо.

+0

@ZheyuanLi я выбираю этот код из книги, так какой таймер я должен использовать, чтобы получить правильный результат? – Debo

+0

@Debo use 'omp_get_wtime()' –

ответ

4

Здесь нет ничего странного. Ваш код равен memory bound, а замедление при переходе от length=50000 к более длинным массивам связано с тем, что данные больше не могут вписаться в кеш последнего уровня ЦП.

  • length=50000: размер данных 4 потока х 2 массива х 50000 элементов х 8 байт на элемент = 3,05 МиБ < L3 размер кэша (6 Мб для i5-4590)
  • length=100000: размер данных 6.10 Мб> кэша L3 размер
  • length=150000: размер данных 9,16 Мб> L3 размер кэша

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

Когда функция вызывается только из основного потока, используемая память составляет 1/4 от того, что используется в параллельной области, и массивы полностью вписываются в кеш-память L3 для всех трех разных длин.

Для получения более подробной информации, свяжитесь с нами по адресу this question.

+0

Разве у каждого процессора нет собственного кеша? –

+1

@ RishitSanmukhani, i5-4590 имеет 6 MiB общего кеша L3, и каждый из четырех ядер имеет 256 KiB частного кэша L2 и 32 KiB частного кеша L1. –