Я новичок в использовании OpenMP. В эти дни я оптимизировал программу и получил разные результаты в разных условиях. Ядро моего кода выглядит следующим образом:Почему мой код с функцией OpenMP отличается от другой среды?
#pragma omp parallel for
for (int thread_id = 0; thread_id < max_thread; thread_id++)
{
int work_start_pos = spos[thread_id];
int work_end_pos = spos[thread_id + 1];
for (int pos = work_start_pos; pos < work_end_pos; pos++)
{
//Calculate some parameters
//A loop with constant length to finish a convolve
}
}
Я собирал и тестировал его в различных средах, ответы правы, но это время, использованное программой различны:
Все программы были составлены с: -O2 -march=native -fopenmp
Windows 7 x64, MinGW GCC 4.7.1 64-bit,
Xeon E3 1230v2 4 Core/8 Threads @ 3.5GHz (I locked it when testing),
8G DDR3 Mem @ 1600MHz
1 Thread , 252.23s
2 Threads, 126.44s
4 Threads, 66.24s
6 Threads, 65.56s
8 Threads, 63.12s
Очевидно, что это линейное ускорение от 1 нити до 4 ниток.
Windows 8.1 x64, MinGW GCC 4.9.2 64-bit,
i7 4702 MQ 4 Cores/8 Threads, 8G DDR3L Mem @ 1600MHz.
When only one CPU is fully loaded, it comes to 3.1GHz. When 4 CPUs are fully loaded, it various from 2.6GHz to 2.8GHz.
1 Thread , 289.33s
2 Threads, 161.56s
4 Threads, 110.43s
6 Threads, 109.89s
8 Threads, 132.00s
Это не полностью линейное ускорение, но почти линейное ускорение. Возможно, процессор Boost прилагает все усилия.
Arch Linux Kernel 3.1.7 x64, GCC 4.9.2 , hardware is same as Windows 8.1 :
1 Thread , 226.67s
2 Threads, 208.82s
4 Threads, 237.58s
6 Threads, 248.67s
8 Threads, 247.11s
Очень странные результаты здесь.
кластер в нашей лаборатории:
CentOS 6.3 x64 release Kernel 2.6.32 GCC 4.4.6,
Core2 Q8400 @ 2.66GHz max (usually the CPU is 2.0GHz), 4 Cores/4 Threads, 4G DDR3 Mem @ 1066MHz
1 Thread , 463.51s
2 Threads, 394.96s
4 Threads, 372.48s
Он сделал убыстрение, при использовании большего количества потоков, но далеко от линейного ускорения. И я также попытался использовать GCC 4.9.2 для компиляции и тестирования в кластере, но почти ничего не изменил.
Когда вы думали, что работаете, скажем, 4 потока, вы уверены, что были на самом деле? это можно проверить с помощью библиотеки времени выполнения OpenMP. Кроме того, ваш код не является правильным способом использования OpenMP. – Walter
Позвольте мне угадать: вы используете 'clock()' во время выполнения программы? –
@HristoIliev. Программа имеет '' секундомер 'module', используя 'clock()' время выполнения программы, но это не основной код, поэтому я немного об этом позабочусь. Любое предложение? – haiguiyingluo