문제

명백한 pragmas를 사용하거나 자동 벡터화에 의존하거나 사용하는 것이 손으로 코드를 벡터화하는 것이 어떤 의미에서 더 낫습니까? 자동 벡터화를 사용한 최적의 성능을 위해서는 루프가 벡터화되거나 벡터 화 될 때까지이를 수정하기 위해 컴파일러 출력을 모니터링해야합니다.

핸드 코딩을 사용하면 원하는 지침이 방출되고 있다고 확신하지만 이제 코드는 휴대용이 없을 가능성이 높습니다 (다른 아키텍처 또는 다른 컴파일러).

도움이 되었습니까?

해결책

자동 벡터화는 나에게 잘 작동하지 않았습니다. 나에게 그것은 자동 벡터화가 현재 매우 사소한 루프에만 효과가있는 것 같습니다.

나는 Pragma/Intrinsic 접근법을 사용하고 어셈블리를 살펴 봅니다. 컴파일러가 잘못된 코드를 생성하는 경우 (SSE를 스택에 스파일 또는 중복 이동 추가) 전체 루프 본체에 인라인 어셈블러를 사용합니다.

이식성은 BTW 문제가 아닙니다. 종종 C/C ++ 루프로 시작하여 내입을 사용하여 최적화합니다. 이전 루프를 유지하고 SIMD 구현을위한 단위 테스트 / 폴백으로 사용하십시오. 또한 컴파일 타임 정의를 통해 프로젝트에서 모든 SIMD 코드를 제거 할 수있는 것이 항상 현명합니다. 응용 프로그램 디버깅입니다 많이 더 쉬운 방법. 동일한 정의를 교차 컴파일에 사용할 수 있습니다.

다른 팁

나는 자동 벡터화에 의존하지 않을 것입니다 어느 컴파일러. 와 함께 gcc 나는 효과가 있기 때문에 나는 두 배로 조심할 것이다 gcc최적화는 항상 버전마다 다릅니다. 특별한 최적화 또는 GCC 확장에 의존하는 사람을 아는 거의 모든 사람들은 새로운 일 때 파손을 처리해야합니다. gcc 버전이 해제됩니다.

일반적으로 Pragmas 및 Intrinsics를 신뢰할 수 있지만 새로운 GCC 버전의 릴리스 노트를 날카롭게 주시해야하며 코드를 컴파일하는 데 필요한 GCC 버전이 무엇인지 사용자에게 알려야합니다.

벡터화가 실제로 중요 할 때 한두 번, 우리는 테스트 스위트에 무언가를 추가했습니다. objdump 벡터 지침이 실제로 사용되고 있는지 확인하십시오. NILS가 설명하는 것처럼 '나쁜 벡터 코드'를 감지 할 수있는 것은 좋지만, 우리는 그렇게 멀리 얻지 못했습니다.

나는 아직 해를 입히는 것보다 더 좋은 자동 벡터 라이저를 보지 못했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top