OpenMP: Intel vs Visual Studio
lexa - 29/Дек/2010 11:46
Непонятки с производительностью OpenMP в случае VisualStudio (см. еще обсуждение в каментах) заставило разобраться.
Выяснилось, что две переменные, которые read-only и вообще объявлены как const - считаются разделяемыми. Как следствие - локи при обращении и прочие удовольствия.
После устранения этого недоразумения (#pragma omp ... private(...)) и замены _mm_store_ps() на _mm_stream_ps(), чтобы в обеих компиляторах выходной массив писался через movntps, все встало на свои места: С-шный код с powf() остается сильно быстрее у Интела т.к. он векторизует powf в _svml_powf4, а SSE-код работает с практически одинаковой скоростью.
Его пример другим наука:
#pragma omp parallel for default(none)
Comments
похоже это косяк VS. если переменная read only то никаких ло
похоже это косяк VS. если переменная read only то никаких локов быть не должно. каждое ядро сделает копию в свой L2(L1) и будет её спокойно читать. возможен конфликт за доступ к общей линии L3, но это случится 1 раз, после этого каждый сделает копию себе (в случае private аналогично).
вот если read after write, тогда да, попа.
я стараюсь вообще не пользоваться private, вместо этого просто определяю локальные переменные внутри параллельного блока.
Не, ну я OpenMP не то, чтобы первый раз увидел, но почти не
Не, ну я OpenMP не то, чтобы первый раз увидел, но почти не пользовался, в реальных программах *было* проще распараллелить более крупными кусками.
Вот, походил по грабелькам, стал опытнее.