2015-10-29 3 views
0

Я работаю над кодом, и я пытаюсь использовать больше потоков в соответствии с руководством, которое мне предоставлено. В нем говорится: «Параллелизм достигается с помощью OpenMP #pragma для динамического выделения строк изображения в разные потоки с потоком для каждого процессора или ядра». А вот в коде:OpenMP #pragma, только один поток, работающий над моим кодом

#pragma omp parallel for schedule(dynamic, 1) // OpenMP 

for (int y = 0; y<height; y++){      // Loop over image rows 
    fprintf(stderr, "\rRendering (%d spp) %5.2f%%", samps, 100.*y/(height - 1)); 
    for (unsigned short x = 0, rng[3] = { 0, 0, y*y*y }; x<width; x++) { // Loop cols 
    ... 

Я попытался изменить количество рабочих потоков в соответствии с этим ..

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

Так что я попытался установить его вместо «статического», но все равно не улучшился.

Я попробовал опцию «АВТО» таким образом, чтобы сеанс планирования был до компилятора .. до сих пор нет решения.

Я также обнаружил, что частное (г) означает, что переменная г является частным для каждого потока, а не общий, но что на самом деле не меняет конечный результат.

Компилятор cl.exe .. Я использую Visual Studio 2013. Любой способ увеличить количество потоков?

+1

Да, как насчет включения OpenMP в Visual Studio. Добавьте '/ openmp' в командную строку или щелкните переключатель в конфигурации проекта. –

ответ

1

В OpenMP, существует несколько способов определения числа потоков, используемых в параллельном регионе:

  • Главным из них является переменной среды OMP_NUM_THREADS. Чтобы использовать его, установите его в среде кода перед его запуском.
  • Функция omp_set_num_threads(). Чтобы использовать его, вызовите его перед достижением параллельной области.
  • Статья num_threads() компилятора parallel.

Относительный приоритет этих определяется стандартом и в значительной степени сводится к num_threads() принимая приоритет omp_set_num_threads(), который имеет преимущество в OMP_NUM_THREADS. Если ни один из трех не используется, то поведение определяется определением реализации. Это может быть, например, запуск только одного потока или запуск как можно большего количества потоков, таких как «ядра» на машине, или что-то еще ...

Таким образом, вы уверены, что вы включили поддержку OpenMP на своем уровень компилятора?

+0

Я получил его, и он работает! Большое спасибо! – Tarta

+0

@Tarta, какая у вас проблема? –

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