C/C++에서 SIMD (AVX 및 AVX2와 같은) 명령어에 내장 함수를 사용할 수 있습니다. Rust에서 SIMD를 사용할 방법이 있습니까?녹에서 SIMD 명령어를 사용할 수 있습니까?
1
A
답변
7
대답은 (큰)주의로, '예 : 야간 컴파일러를 사용하여 필요
- 은 인라인 어셈블리 (또는 당신을 위해 그렇게 상자)를 사용하여 필요
- .
참고 : FFI를 사용하여 FFI를 사용하는 라이브러리에서 링크 할 수도 있습니다. 예를 들어 Shepmaster's cupid crate은 런타임에 이러한 기능을 사용하여 CPU 기능에 액세스합니다.
녹에서 SIMD 지원의 미래는 여기에 설명되어 있습니다 : Getting explicit SIMD on stable Rust. 그것은 오래 동안 바람 피었지만 (현재 327 개의 게시물), 앞으로 나아갑니다.
- 배향 :
여러 기술적 장애물있다 SIMD 명령어의 개수는 오히려 "단지"64 비트보다 일반적인 (128 비트/256 비트/512 비트보다 더 엄격하게 정렬 인수가 필요) 아직 지원하지 않는 Rust가있는 경우
- 정렬되지 않은로드/저장 : 여러 개의 SIMD 명령어가 정렬되지 않은 피연산자를 사용할 수 있습니다. 정렬되지 않은로드/저장을 효율적으로 매핑하는 것은 현재 다소 어려움입니다.
- 명령어 수 : 문자 그대로 수천 개의 명령어가 있으며 각각은 자신의 파라미터 세트와 요구 사항을 가지고있다. ts; 효율적이고 정확하게 매핑하는 방법은 알 수 없습니다. 특히 문서가 부족할 수 있습니다.
- 방법은 유형이 제시되어야한다 :
또한 API 디자인 질문이 있습니다? 정렬 된 인수와 정렬되지 않은 인수는 다른 유형을 사용해야합니까?
- 유형 간의 변환이 허용되어야합니까? 어떤 조건 하에서?
- 지침은 어떻게 제시해야합니까? (기능 단위당 CPU 당?)
- 항상 지침에 액세스 할 수 있어야합니까? 또는 기능 집합이 대상 CPU에 존재하도록 보장되는 경우에만 액세스 가능해야합니까?
- intrinsic은 (대상과 관계없이) 정확한 지침으로 낮춰야합니까? 아니면 명령이 존재하지 않을 것이라면 에뮬레이션 코드로 내려야합니까?
- 기능 특수화 (로드 시간 선택은 ELF에서 가능)가 가능합니까?
- ...
토론의 목적은, 지금까지 안정에 실험을 할 수 있도록 컴파일러에 최소한의 지원을받을하고 거기에서 구축하는 것입니다. 문제는 모든 사람이 최소한의 의미에 동의하지는 않는다는 것입니다.
BurntSushi (정규 표현식 작성자)가 토론을 이끌고 있으며 최소한의 컴파일러 지원 접근법의 타당성을 보여주기 위해 with a stdsimd
crate을 실험하고 있습니다.
** 인라인 어셈블리가 필요하지 않습니다. ** 야간에. 예를 들어 C로 컴파일 된 심 (shim)을 사용하거나 Rust에 링크 된 직접 어셈블리를 사용할 수도 있습니다 (예 : [my cupid crate] (https://github.com/shepmaster/cupid/blob/1ac5bfcc783ab59163dbbf0462754e0373f56069/build.rs) 참조). – Shepmaster
@Shepmaster : 메모를 추가했습니다. 그러나 나는 개인적으로 그것이 더 이상 "SIMD in Rust"가 아니라고 느낍니다. 또한 지나치게 정렬 된 인수가 필요한 명령어는 정렬을 지정할 수없는 경우 많은주의가 필요합니다. FFI가 어떻게 도움을 줄 수 있는지 알지 못합니다. –
그래, 내 다른 상자 중 하나는 훨씬 더 수동 방식으로 정렬을 처리해야합니다. 그러나이 경우 한 번 잘못 정렬 된 데이터를 처리 한 다음 긴밀한 루프에서 데이터를 정렬해야하므로 한 단계 위로 작업하는 것이 더 좋습니다. – Shepmaster