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 приводит к ошибкам.
пятница, 18 декабря 2009 г.
Подписаться на:
Комментарии к сообщению (Atom)
3 комментария:
firstprivate(j) нужен потому, что по умолчанию j будет shared, и ее одновременное изменение в for(; j < doubleI; ++j) приведет к непредсказуемым последствиям.
Для reduction(+: sum) аналогично.
Директива lastprivate(i) здесь не нужна. Она гарантирует лишь то, что после секции #pragma omp for переменная i будет иметь значение count. В противном случае ее значение не определено.
Для отладки подобных штук чрезвычайно полезен Intel Thread Checker (версия для Линукс бесплатна для некоммерческого использования).
Саш, спасибо. Ты знаешь, в статье, которую я цитировал, счетчик внешнего цикла объявлен lastprivate. В моем случае наличие этой директивы чуть-чуть (на 1-2 миллисек на 2х ядерном компе) ускоряет работу приложения.
Для меня это удивительно!
Боюсь, не могу это никак прокомментировать.
Может быть, какое-нибудь compiler voodoo (кажется, это словосочетание вычитал в документации по FFTW)
Отправить комментарий