2016-06-23 6 views
11

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 , 내가 셔플 동작을 정의하는 마스크 레지스터에서 오는 것을 의미한다. 이로 인해 addinc보다 유연하거나 동일한 변수 변경이 즉각적인 변경보다 유연한 것과 같은 방식으로 즉각적인 셔플 마스크를 사용하는 이전 변종보다 유연한 명령이 가능합니다.

2 또는 AVX2 32 등의 조회.

더 짧은 인코딩을 사용하거나 메모리에서 마스크를로드하는 것을 피하는 경우 이전 지침이 유용 할 수 있지만 기능적으로 대체됩니다.

+0

s/babble/dabble /? 또한 "런타임에 선택 가능"에 대한 좋은 용어는 "가변 셔플"입니다. 가변 시프트 인스트럭션 (['vpsrlvd'] (http://www.felixcloutier.com/x86/VPSRLVD:VPSRLVQ.html))은 이미이 용어를 사용합니다. –

+0

예, * dabble *, 때때로 흔들릴 수도 있습니다. "변수"에 대해 잘 모르겠습니다. 나는 시프트가 "즉각적이든 아니든"문제와 거의 직각 인 것으로 생각한다. 문제는 다른 벡터 요소에 대해 다른 시프트 수를 발행 할 수 없다는 것입니다. 벡터'add'만이 모든 원소에 단일 값을 추가 할 수있는 경우와 조금 다릅니다. 이는 인수가 직접적으로 만 지정 될 수 있는지 여부와 구별됩니다. 비록 대부분의 사람들이 그 문제를 가지고 있지 않기 때문에 약간의 변화가 있다고 생각합니다. 비트는 인텔이 "가변적 인"의미로 사용하는 것에 대한 제 인상입니다. – BeeOnRope

+0

좋은 점은 이미 xmm reg의 low64에있는 모든 요소에 대해 shift-count를 가질 수 있다는 것입니다. 여전히 "가변 셔플"은 약간의 문맥이 주어지면 설명없이 즉시 명백하다고 생각합니다. –

답변

10

99 %는 트랜지스터의 구현 비용입니다. 분명히 매우 유용 할 것이고, 존재하지 않는 유일한 이유는 구현 비용이 중요한 이점보다 커야한다는 것입니다.

코딩 공간 문제는 발생하지 않습니다. VEX 코딩 공간은 많은 공간을 제공합니다. 접두어의 조합을 나타내는 필드가 비트 필드가 아니기 때문에, 대부분의 값이 사용되지 않은 정수입니다.

그들은 AVX512BW 및 AVX512F에서 사용할 수있는 큰 요소 크기로하지만, AVX512VBMI을 위해 그것을 구현하기로 결정했다. 어쩌면 그들은 그것을 갖지 않기 위해 얼마나 빨려 들었는지, 어쨌든 그것을하기로 결정했을 것입니다.AVX512F는 많은 면적/트랜지스터를 구현해야하기 때문에 인텔은 소매 용 데스크톱 CPU에 구현하지 않기로 결정했습니다 for a couple generations.

(요즘은 새로운 명령어 세트를 이용할 수있는 많은 코드가 클라이언트 시스템에서 사용하기 위해 런타임 디스패치 대신 알려진 서버에서 실행되도록 작성되었다고 생각합니다.)

위키 백과에 따르면 AVX512VBMI는 Cannonlake까지 올 수 없지만 128B 테이블 (2 개의 zmm 벡터)에서 64 개의 병렬 테이블 조회를 수행하는 vpermi2b을 갖게됩니다. Skylake Xeon은 vpermi2w 이상의 큰 요소 크기 (AVX512F + AVX512BW) 만 가져옵니다. 1 muxers 넓은 4 배되는 : 8이 경우에도 1 muxers : 1 muxers 여덟 (8)보다 훨씬 더 비싸다 :


나는 삼십 (32)는 것을 확신합니다. 차선을 횡단하는 셔플은 작업을 완료하기 위해 3 사이클의 시간 예산을 확보하기 때문에 여러 단계의 셔플 링 (단일 32 : 1 단계가 아닌)으로 구현할 수 있습니다. 그러나 여전히 많은 트랜지스터.

하드웨어 디자인 경험이있는 사람으로부터 손이 덜 낀 답변을보고 싶습니다. 나는 브레드 보드에 TTL 카운터 칩으로부터 디지털 타이머를 구축했다. (그리고 IIRC, TI-99/4A의 BASIC 카운터를 20 년 전에 매우 쓸모 없었다.).


IT는 SSE PSHUFB 명령은 모든 시간의 가장 유용한 지침 중 꽤 많은 것을 아주 분명하다.

넵. 즉각적인 것이 아니라 레지스터에서 제어 마스크를 사용하는 최초의 가변 셔플이었습니다. pcmpeqb/pmovmskb 결과를 기반으로 한 셔플 마스크의 LUT에서 임의의 마스크를 찾으려면 몇 가지 미친 강력한 작업을 수행 할 수 있습니다. @stgatilov's IPv4 dotted-quad -> int converter은 멋진 SIMD 트릭의 가장 좋아하는 예 중 하나입니다.

+0

답변을 통해 반쯤은 "괜찮습니다.하지만 하드웨어 사람이 뭐라고 하죠?"라고 말할 것입니다. -하지만 그건 당신이 말한 것입니다. :) muxes가 많은 트랜지스터를 사용한다고 생각하지만, PSHUFB가 이미 거기에 있기 때문에 실제로 32x 16 : 1 muxers가 있습니다. 따라서 3 비트 예산에서 추가적인 1 비트 조회 및 혼합이 상당히 쉬워야하는 것처럼 보입니다. 기존의 크로스 레인 셔플 때문에 크로스 레인 기계류의 대부분이 그곳에있을 가능성이 큽니다. 내 실제 하드웨어 디자인 경험은 당신과 비슷합니다. – BeeOnRope

+1

vpermi2b에 대하여, 나는이 위대한 지시가 AVX512F에서 곧 나올 것이라고 생각했지만, 지금은 AVX512VBMI까지는 이해가 안되는 것 같습니다.그 확장이 언제 올지 모릅니다. 더 약한 형태의 일부는 F와 BW 확장에 나타납니다. – BeeOnRope

+0

@BeeOnRope : 젠장, 나는 그 사실도 놓쳤다. 위키피디아는 캐넌 레이크 (Cannonlake)를 위해 계획했다고 말했습니다. Skylake Purley에서 AVX512BW라고 생각했습니다. 하지만 당신 말이 맞아요. 심지어 vpermb도 AVX512VBMI입니다. 제온 브랜드의 SKL 코어에는 AVX512가 없기 때문에 실망 스럽습니다. 저렴한 가정용 데스크톱을 위해 싼 Xeons를 지원하는 것은 훨씬 더 비싼 제온입니다. ( –