#xcode #openmp #sse #llvm-gcc
#xcode #openmp #sse #llvm-gcc
Вопрос:
Я переключил свой компилятор на LLVM GCC 4.2 в XCode 4.2 из GCC и столкнулся со странной ошибкой компоновщика для _mm_shuffle_ps, встроенного в OpenMP. Эта функция будет работать где угодно, но как только я помещаю ее в блок omp, она начинает генерировать следующую ошибку компоновщика:
"___builtin_ia32_shufps", referenced from:
__ZN7Annulus12traceFactorsEP9PrimitiveP8VFMatrix.omp_fn.0 in Annulus.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Базовая структура моего кода следующая :
#pragma omp parallel {
//Some stuff
#pragma omp for {
//Do more stuff including _mm_shuffle_ps
}
}
Код отлично работает в GCC 4.2, так что это ошибка в реализации OpenMP в LLVM GCC или мне нужен экзотический флаг компилятора?
Комментарии:
1. возможно, вам следует указать используемую платформу (CPU arch?) и используемые флаги компилятора. Похоже, что у вас отсутствует специфичная для ia32 функция, но вы ссылаетесь на версию x86_64. Возможно, флаги / определения компилятора отключены
2. Я компилирую на MacPro (OS X 10.7.2, четырехъядерный процессор Intel Xeon с частотой 2,8 ГГц), однако я также пробовал на MacPro (OS X 10.6.8, четырехъядерный процессор Intel Xeon 2 x 2,26). Все флаги компилятора являются значениями по умолчанию в Xcode с включенными OpenMP и SSE. Поскольку он работает вне блоков OpenMP, я бы подумал, что это не мои существующие настройки.
Ответ №1:
Полностью ошибка. Пожалуйста, запишите это. Спасибо.
Ответ №2:
Просто К вашему сведению:
Здесь у меня та же проблема, но с инструкцией shuf_pd. Другие встроенные функции работают просто отлично. Я только что отправил эту ошибку в Apple.
Возможно, существует обходной путь, который я еще не пробовал: поместите весь код SSE в другую функцию и вызовите ее из цикла OpenMP.
Комментарии:
1. Я также отправил сообщение об ошибке в Apple. Да, я думал о том, чтобы поместить это в другую функцию, однако, чтобы получить ту же производительность, она должна быть встроенной, что, вероятно, все равно выдаст ошибку. Тем временем я вернулся к использованию GCC4.2