Создать векторный код из Haskell? - PullRequest
3 голосов
/ 21 сентября 2009

Можно ли заставить GHC производить код SIMD для различных поколений SSE?

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

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

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

1 Ответ

8 голосов
/ 21 сентября 2009

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

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

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

...