пятница, 18 декабря 2009 г.

OpenMP & Visual Studio notes

1. Свойства проекта
Debugging -> Command Arguments - можно прописать аргументы командной строки Вашей проги и дебужить из студии (а не запускать прогу из консоли)

С/С++ -> Language -> OpenMP Support - вкл/выкл поддержку OpenMP. Если включено -
определен символ _OPENMP. Если нет - все прагмы игнорируются.

2. Кусочек кода отсюда

float sum = 10.0f;
MatrixClass myMatrix;
int j = myMatrix.RowStart();
int i;
#pragma omp parallel
{ #pragma omp for firstprivate(j) lastprivate(i) reduction(+: sum)
for(i = 0; i < count; ++i)
{
int doubleI = 2 * i;
for(; j < doubleI; ++j)
sum += myMatrix.GetElement(i, j);
} }

Не знаю, насколько критичен здесь lastprivate, но отсутствие firstprivate и reduction приводит к ошибкам.

3 комментария:

Alexander Pozdneev комментирует...

firstprivate(j) нужен потому, что по умолчанию j будет shared, и ее одновременное изменение в for(; j < doubleI; ++j) приведет к непредсказуемым последствиям.

Для reduction(+: sum) аналогично.

Директива lastprivate(i) здесь не нужна. Она гарантирует лишь то, что после секции #pragma omp for переменная i будет иметь значение count. В противном случае ее значение не определено.

Для отладки подобных штук чрезвычайно полезен Intel Thread Checker (версия для Линукс бесплатна для некоммерческого использования).

trinidados комментирует...

Саш, спасибо. Ты знаешь, в статье, которую я цитировал, счетчик внешнего цикла объявлен lastprivate. В моем случае наличие этой директивы чуть-чуть (на 1-2 миллисек на 2х ядерном компе) ускоряет работу приложения.

Alexander Pozdneev комментирует...

Для меня это удивительно!
Боюсь, не могу это никак прокомментировать.
Может быть, какое-нибудь compiler voodoo (кажется, это словосочетание вычитал в документации по FFTW)