자동 벡터화 대 손으로 벡터화 된 코드
-
03-07-2019 - |
문제
명백한 pragmas를 사용하거나 자동 벡터화에 의존하거나 사용하는 것이 손으로 코드를 벡터화하는 것이 어떤 의미에서 더 낫습니까? 자동 벡터화를 사용한 최적의 성능을 위해서는 루프가 벡터화되거나 벡터 화 될 때까지이를 수정하기 위해 컴파일러 출력을 모니터링해야합니다.
핸드 코딩을 사용하면 원하는 지침이 방출되고 있다고 확신하지만 이제 코드는 휴대용이 없을 가능성이 높습니다 (다른 아키텍처 또는 다른 컴파일러).
해결책
자동 벡터화는 나에게 잘 작동하지 않았습니다. 나에게 그것은 자동 벡터화가 현재 매우 사소한 루프에만 효과가있는 것 같습니다.
나는 Pragma/Intrinsic 접근법을 사용하고 어셈블리를 살펴 봅니다. 컴파일러가 잘못된 코드를 생성하는 경우 (SSE를 스택에 스파일 또는 중복 이동 추가) 전체 루프 본체에 인라인 어셈블러를 사용합니다.
이식성은 BTW 문제가 아닙니다. 종종 C/C ++ 루프로 시작하여 내입을 사용하여 최적화합니다. 이전 루프를 유지하고 SIMD 구현을위한 단위 테스트 / 폴백으로 사용하십시오. 또한 컴파일 타임 정의를 통해 프로젝트에서 모든 SIMD 코드를 제거 할 수있는 것이 항상 현명합니다. 응용 프로그램 디버깅입니다 많이 더 쉬운 방법. 동일한 정의를 교차 컴파일에 사용할 수 있습니다.
다른 팁
나는 자동 벡터화에 의존하지 않을 것입니다 어느 컴파일러. 와 함께 gcc
나는 효과가 있기 때문에 나는 두 배로 조심할 것이다 gcc
최적화는 항상 버전마다 다릅니다. 특별한 최적화 또는 GCC 확장에 의존하는 사람을 아는 거의 모든 사람들은 새로운 일 때 파손을 처리해야합니다. gcc
버전이 해제됩니다.
일반적으로 Pragmas 및 Intrinsics를 신뢰할 수 있지만 새로운 GCC 버전의 릴리스 노트를 날카롭게 주시해야하며 코드를 컴파일하는 데 필요한 GCC 버전이 무엇인지 사용자에게 알려야합니다.
벡터화가 실제로 중요 할 때 한두 번, 우리는 테스트 스위트에 무언가를 추가했습니다. objdump
벡터 지침이 실제로 사용되고 있는지 확인하십시오. NILS가 설명하는 것처럼 '나쁜 벡터 코드'를 감지 할 수있는 것은 좋지만, 우리는 그렇게 멀리 얻지 못했습니다.
나는 아직 해를 입히는 것보다 더 좋은 자동 벡터 라이저를 보지 못했습니다.