Возможная ошибка OpenMP SSE при использовании _mm_shuffle_ps в Xcode 4 (LLVM GCC)

#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