OpenMP: Intel vs Visual Studio

Непонятки с производительностью 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)
и явное прописывание shared/private/whatever для всех переменных.

Comments

похоже это косяк VS. если переменная read only то никаких локов быть не должно. каждое ядро сделает копию в свой L2(L1) и будет её спокойно читать. возможен конфликт за доступ к общей линии L3, но это случится 1 раз, после этого каждый сделает копию себе (в случае private аналогично).
вот если read after write, тогда да, попа.
я стараюсь вообще не пользоваться private, вместо этого просто определяю локальные переменные внутри параллельного блока.

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

Вот, походил по грабелькам, стал опытнее.