AVX2에는 좋은 콘텐츠가 많이 있습니다. 예를 들어, 그것은 그들의 전구체보다 훨씬 엄격하게 많은 지침을 가지고 있습니다. VPERMD
가지고 : 당신이 완전히 임의의 다른에 32 비트 값 중 하나를 256 비트 길이의 벡터에서/셔플/교환하다을 방송 할 수 있으며, 런타임 1의 순열 선택으로. 기능적으로, 그것은 기존의 풀고, 방송하고, 바꾸고, 뒤섞고, 바꾸는 지시 사항을 완전히 뒤엎습니다. .AVX2의 VPERMB은 어디에 있습니까?
쿨한 콩.
여기가 VPERMB
입니까? 즉, 동일한 명령어이지만 바이트 크기의 요소에 대한 작업입니다. 또는, 그 문제에 대해, VPERMW
은 16 비트 요소에 대해? 얼마 동안 x86 어셈블리를 처음 보았을 때, SSE PSHUFB
명령어는 모든 시간에 가장 유용한 명령어 중 상당 부분을 차지합니다. 가능한 모든 순열, 브로드 캐스트 또는 바이트 단위 셔플을 수행 할 수 있습니다. 또한 16 비트 병렬 4 비트 -> 8 비트 테이블 조회를 수행하는 데 사용할 수도 있습니다 .
PSHUFB
는 AVX2 크로스 차선으로 확장되지, 그래서 그것은 내 차선 행동으로 제한됩니다.
VPERM
명령어는 크로스 셔플을 수행 할 수 있습니다 (실제로 "perm"및 "shuf"는 명령어 니모닉에서 동의어로 보입니다).하지만 8 비트 및 16 비트 버전은 생략 되었습니까?
이 명령어를 에뮬레이트하는 좋은 방법 인 것처럼 보이지 않지만 작은 너비의 셔플을 쉽게 에뮬레이션 할 수 있습니다 (종종 다른 마스크 만 있으면됩니다).
나는 Intel이 PSHUFB
의 광범위하고 과도한 사용을 알고 있다는 것에 의심의 여지가 없으므로 AVX2에서 바이트 변형이 생략 된 이유는 자연스럽게 발생합니다. 작업이 본질적으로 하드웨어로 구현하기가 더 어렵습니까? 생략을 강요하는 인코딩 제한이 있습니까? 런타임에 선택함으로써
1 , 내가 셔플 동작을 정의하는 마스크 레지스터에서 오는 것을 의미한다. 이로 인해 add
이 inc
보다 유연하거나 동일한 변수 변경이 즉각적인 변경보다 유연한 것과 같은 방식으로 즉각적인 셔플 마스크를 사용하는 이전 변종보다 유연한 명령이 가능합니다.
2 또는 AVX2 32 등의 조회.
더 짧은 인코딩을 사용하거나 메모리에서 마스크를로드하는 것을 피하는 경우 이전 지침이 유용 할 수 있지만 기능적으로 대체됩니다.
s/babble/dabble /? 또한 "런타임에 선택 가능"에 대한 좋은 용어는 "가변 셔플"입니다. 가변 시프트 인스트럭션 (['vpsrlvd'] (http://www.felixcloutier.com/x86/VPSRLVD:VPSRLVQ.html))은 이미이 용어를 사용합니다. –
예, * dabble *, 때때로 흔들릴 수도 있습니다. "변수"에 대해 잘 모르겠습니다. 나는 시프트가 "즉각적이든 아니든"문제와 거의 직각 인 것으로 생각한다. 문제는 다른 벡터 요소에 대해 다른 시프트 수를 발행 할 수 없다는 것입니다. 벡터'add'만이 모든 원소에 단일 값을 추가 할 수있는 경우와 조금 다릅니다. 이는 인수가 직접적으로 만 지정 될 수 있는지 여부와 구별됩니다. 비록 대부분의 사람들이 그 문제를 가지고 있지 않기 때문에 약간의 변화가 있다고 생각합니다. 비트는 인텔이 "가변적 인"의미로 사용하는 것에 대한 제 인상입니다. – BeeOnRope
좋은 점은 이미 xmm reg의 low64에있는 모든 요소에 대해 shift-count를 가질 수 있다는 것입니다. 여전히 "가변 셔플"은 약간의 문맥이 주어지면 설명없이 즉시 명백하다고 생각합니다. –