나는 부동 소수점 값의 배열을 가지고 있으며, 나는 그것들 모두의 합계를 취한 다음 그 합계로 모든 것을 나누는 것과 같이 쉽게 vectorizable 연산을 할 필요가있다. 또한 배열의 개별 요소에 액세스 (대부분 읽기)해야합니다. 나는 배열의 벡터화를 가능하게하기 위해 SIMD 타입을 사용할 수 있다고 생각했다.이 변환은 SIMD의 배열에서 일반 숫자 유형으로 정의되지 않은 동작입니까?
extern crate simd;
use simd::x86::avx::f32x8;
fn main() {
let values8: [f32x8; 100] = [f32x8::splat(1.1); 100];
let values: &[f32; 800] = unsafe { std::mem::transmute(&values8) };
println!("{}", values[333]);
}
: 나는 배열의 개별 요소와 많은 일을해야 할 것입니다 때마다, 나는 그렇게처럼, 대신에 참조하는 일반 부동 소수점 값의 배열에 대한 참조로 배열 및 액세스를 버리는 것
이것은 컴파일되고 정상적으로 작동하는 것 같습니다. I read 때문에 그러나 나는이 정의되지 않은 동작이 걱정 해요 : 비에 repr (C) 유형 간의
변형의이 UB
이다 내가 생각 SIMD 유형 (simd::x86::avx::f32x8
을 같은)이다 repr(simd)
내가 돈 [f32; 800]
이 repr(C)
이라고 생각하지 마십시오.
이러한 부동 소수점 값을 얻기 위해 extract
메서드를 SIMD 형식에서 사용할 수 있지만 앞에서 설명한 변환 - 투 - 규칙 배열 방식을 사용하면 코드가 훨씬 간단 해집니다.
나는 반 방법이 될 것입니다 VEC가하는 것처럼 f32x8'은'대출'<[f32]>를 구현하지 않는 이유'좋은 이유가 거기에 있는지 알고 싶네 집. 어쩌면 레이아웃/순서가 호환되는 것은 아닙니다. –