2009-09-20 2 views
3

Возможно ли получить GHC для получения кода SIMD для различных поколений SSE?Код генерации: Haskell?

Например. есть программа, как этот

import Data.Array.Vector 
main = print . sumU $ (enumFromToFracU 1 10000000 :: UArr Double) 

Я могу видеть сгенерированный код (скомпилированный для 64 битной x86) используют инструкции SSE в скалярном режиме (как C и ASM бэкэндов). Так что addd вместо addpd. Для типов программ, которые я работаю над использованием векторных инструкций, важно для производительности. Есть ли простой способ для новичков, таких как я, чтобы заставить GHC SIMDize кода использовать SSE?

ответ

8

Да, возможно, через C-сервер, но это пробная версия и ошибка. Флаги я использую:

gcc -O2 -funbox-strict-fields -fvia-C -optc-O3 -march=native -optc-msse4 

Тогда надеюсь GCC видит тугой цикл GHC генерирует через код uvector, и понимает, что есть SIMD потенциал.

+0

Спасибо за подсказки - не может получить ghc & gcc, чтобы сотрудничать с некоторыми простыми вызовами uvector. Сейчас я буду экспериментировать, я знаю, что это так. По-видимому, по крайней мере, по крайней мере, что icc не используется в качестве C-сервера - это barfs на ghc-6.10.4/lib/ghc-6.10.4/include/Regs.h, поскольку «error: variable type» union «не подходит для регистрации». – billt

+0

Получение работы icc будет вполне достижением. –

Смежные вопросы