Haskell에서 벡터 코드를 생성 하시겠습니까?
-
12-09-2019 - |
문제
GHC가 다양한 SSE 세대를위한 SIMD 코드를 생성 할 수 있습니까?
예를 들어. 이와 같은 프로그램이 있습니다
import Data.Array.Vector
main = print . sumU $ (enumFromToFracU 1 10000000 :: UArr Double)
생성 된 코드 (64 비트 x86에 대해 컴파일) 스칼라 모드 (C 및 ASM 백엔드 모두)에서 SSE 지침을 사용하는 것을 볼 수 있습니다. addpd보다는 addsd입니다. 프로그램 유형의 경우 벡터 지침을 사용하는 것이 성능에 중요합니다. 나 자신과 같은 초보자가 GHC가 SSE를 사용하여 코드를 동시화 할 수있는 쉬운 방법이 있습니까?
해결책
예, C 백엔드를 통해 가능하지만 시행 착오입니다. 내가 사용하는 깃발 :
gcc -O2 -funbox-strict-fields -fvia-C -optc-O3 -march=native -optc-msse4
그런 다음 GCC가 Uvector 코드를 통해 타이트 루프 GHC가 생성하는 것을 발견하고 SIMD 잠재력이 있음을 깨닫습니다.
제휴하지 않습니다 StackOverflow