2014-01-07 2 views
3

Я пытаюсь параллелизовать часть программы на C++ с помощью OpenMP в QtCreator в Linux на VirtualBox. Хост-система имеет процессор 4core. Поскольку мои первоначальные попытки использовать opengram pragmas, похоже, не работали (код с openmp занял почти то же самое время, что и без), я вернулся к вики OpenMP и попытался запустить этот простой пример.OpenMP в Qt на VirtualBox использует только один поток

int main(void) 
    { 
     #pragma omp parallel 
     printf("Hello, world.\n"); 
     return 0; 
    } 

и выход только

'Hello, world'. 

Я также попытался запустить этот кусок кода

int main() { 
    int thread_number; 
    #pragma omp parallel private(thread_number) 
    { 
     #pragma omp for schedule(static) nowait 
     for (int i = 0; i < 50; i++) { 
      thread_number = omp_get_thread_num(); 
      cout << "Thread " << thread_number << " says " << i << endl; 
     } 
    } 
    return 0; 
} 

и выход:

Thread 0 says 0 
Thread 0 says 1 
Thread 0 says 2 
. 
. 
. 
. 
Thread 0 says 49 

Так это выглядит например, не происходит параллелизма в конце концов. Я установил QMAKE_CXXFLAGS + = -fopenmp QMAKE_LFLAGS + = -fopenmp в файле .pro. Это происходит потому, что я запускаю его с виртуальной машины? Как мне сделать многопоточную работу? Я был бы очень признателен за любые предложения/указатели. Спасибо.

+0

Компиляция этого кода с помощью только 'g ++ -fopenmp omp.cpp &&./A.out' выводит 4x Hello World для меня, так что что-то подозрительное происходит с вашим виртуальным боксом, возможно, попробуйте qemu? – OneOfOne

+0

Многопоточность отлично работает на виртуальных машинах, даже если они только эмулируют единое ядро ​​процессора. Вероятно, опция '-fopenmp' не попадает в параметры компилятора или вы используете Clang, который не поддерживает OpenMP (пока). –

ответ

0

Попробуйте установить переменную окружения OMP_NUM_THREADS. По умолчанию может быть 1, если ваша виртуальная машина говорит, что у нее есть одно ядро ​​(это происходило со мной).

1

Ваша проблема в том, что VirtualBox всегда по умолчанию использует машину с одним ядром. Перейдите в раздел «Настройки/Система/Процессор» и увеличьте количество процессоров на количество аппаратных потоков (4 в вашем случае или восемь, если у вас есть гиперпоточность). Если вы используете hyperthreading, VirtualBox предупредит вас, что вы выбрали больше процессоров, чем физические CPU. Игнорировать предупреждение.

Я установил свои процессоры в восемь. Когда я использую OpenMP в GCC на Windows, я получаю восемь потоков.

Редактировать: В соответствии с VirtualBox's manaual вы должны установить количество потоков на число физических ядер, а не количество гиперпотоков.

Вы не должны, однако, настраивать виртуальные машины для использования большего количества ядер процессора, чем у вас есть физически (реальные ядра, без гиперпотоков).

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