2015-01-31 2 views
2

Я новичок в использовании 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 для компиляции и тестирования в кластере, но почти ничего не изменил.

+0

Когда вы думали, что работаете, скажем, 4 потока, вы уверены, что были на самом деле? это можно проверить с помощью библиотеки времени выполнения OpenMP. Кроме того, ваш код не является правильным способом использования OpenMP. – Walter

+0

Позвольте мне угадать: вы используете 'clock()' во время выполнения программы? –

+0

@HristoIliev. Программа имеет '' секундомер 'module', используя 'clock()' время выполнения программы, но это не основной код, поэтому я немного об этом позабочусь. Любое предложение? – haiguiyingluo

ответ

0

Это не совсем ответ, но слишком длинный для комментария. Я просто палочка, чтобы указать, что omp parallel for действительно должен использоваться только для параллелизации циклов for с (как правило) многими итерациями, чем потоки. Для того, чтобы иметь каждую нить получить ровно один кусок, просто использовать omp parallel как в

#pragma omp parallel 
{ 
    int thread_id = omp_get_thread_num(); 
    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 
    } 
} 

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

+0

Спасибо. Я попробовал ваш код сегодня утром, и это не имело никакого значения.Первоначальная программа выглядит как 'for (int d_index = 0; d_index haiguiyingluo

Смежные вопросы