Компании Intel ПРАГМА Симд против примененных в ПРАГМА ОМП Симд
Компилятор Intel позволяет нам векторизировать циклы через
#pragma simd
for ( ... )
Однако у вас также есть возможность сделать это с помощью директивы OpenMP 4:
#pragma omp simd
for ( ... )
Есть ли какая-то разница между ними?2 ответа:
Во всех отношениях они должны быть идентичны. Разница в том, что директива OpenMP 4.0
#pragma omp simd
является портативной и должна работать с другими компиляторами, поддерживающими OpenMP 4.0, а также Intel.Кроме того, в OpenMP версии есть несколько предложений, которые позволяют векторизировать инструкции более надежным способом (
safelen()
,linear()
,aligned()
,reduction()
, иcollapse()
приходят на ум).
#pragma simd
- позиционируется как часть расширений Intel C++ Cilk SIMD (наряду с нотацией массива). Такое позиционирование выглядит несколько странным, поскольку Cilk не предназначен для Fortran, в то время как компилятор Fortran поддерживает в основном идентичную директиву simd.
#pragma omp simd
- это часть стандартаOpenMP , поэтому он, естественно, более переносим для компилятора и платформ.
Обычно Intel выкатываетновые возможности в Cilk first и в OpenMP second. Причина очень проста. естественно: требуется время, чтобы принять что-то как часть стандарта OpenMP. Например,
simdlen
был добавлен в OpenMP4. 5 только в ноябре 2015 года, в то время как аналогичное предложение (vectorlength
) уже было частью Cilk pragma 3 или 4 года назад. simdlen vs. vectorlength выделяет еще одно наблюдение, что синтаксис некоторых предложений pragma может отличаться между simd и omp simd.Итак, если вам нужна переносимость между компиляторами, используйте OpenMP pragma. Но если для вас важнее получить доступ к новому simd возможности компилятора как можно раньше, затем вы можете предпочесть или опционально использовать Cilk (proprietary) pragma. Все те же аргументы и соображения одинаково применимы к #pragma omp declare simd vs.
#pragma declare simd
(что должно ответить на ваш потенциальный второй вопрос).Ссылка на предложения pragma simd" Cilk " доступна здесь: https://software.intel.com/en-us/node/524555 (Я думаю, что это немного устарело; я слышал о новых возможностях pragma simd, не отраженных в этой ссылки пока нет).