2016-12-19 2 views
0

저는 방금 CUDA의 __byte_perm 내장 함수와 동일한 AMD를 발견했습니다. amdgcn_ds_swizzle (또는 적어도 바이트 순열 함수와 같다고 생각합니다.) 내 문제는 이것입니다 : CUDA의 바이트 퍼밋은 2 개의 부호없는 32 비트 정수를 취한 다음 선택기 인수 (16 진수 값으로 제공됨)의 값에 따라이를 치환합니다. 그러나 AMD의 swizzle 함수는 부호없는 하나의 32 비트 정수와 "패턴"으로 명명 된 하나의 int만을 사용합니다. AMD의 Swizzle 내장 함수는 어떻게 활용합니까?AMD HCC Swizzle Intrinsic

+0

설명서를 읽었습니까? – user3528438

+0

[This] (http://scchan.github.io/hcc/hc_8hpp.html)는 제가 가지고있는 유일한 매뉴얼입니다. 많은 정보를주지는 않습니다. 나는 인터넷을 통해 이미 검색했고, 불행히도 아무것도 찾지 못했다. (내가 틀린 장소를보고 있지 않는 한). 그래서 나는 나의 최후의 수단으로 stackoverflow를 사용했다. – ligosan

+0

http://gpuopen.com/amd-gcn-assembly-cross-lane-operations/ – user3528438

답변

0

ds_swizzle__byte_perm은 약간 다릅니다. 하나는 레인 전체에 걸쳐 전체 레지스터를 순열하고 두 개의 32 비트 reg에서 임의의 4 바이트를 순차적으로 바꿉니다.

AMD의 ds_swizzle_b32 GCN 명령은 값을 실제로 다른 레인과 교환합니다. 읽을 차선에 32 비트 레지스터를 지정하고 배치 할 32 비트 레지스터를 지정합니다. 또한 하드 코드 된 값을 지정하여이를 어떻게 바꿔야하는지 지정합니다. ds_swizzle_b32에 대한 훌륭한 설명은 user3528438이 지적한대로 here입니다.

__byte_perm은 다른 레인과 데이터를 교환하지 않습니다. 자체 레인에있는 두 개의 32 비트 레지스터에서 4 바이트를 수집하여 레지스터에 저장합니다. 교차 차선 트래픽이 없습니다.

AMD GCN 하드웨어에서 "바이트 순열"을 수행하는 방법이 다음 질문 일 것이라고 생각합니다. 그 지시는 v_perm_b32입니다. (12-152 페이지 참조 here) 기본적으로 두 개의 지정된 32 비트 레지스터에서 4 바이트를 선택합니다.

+0

이 정보를 제공해 주셔서 감사합니다. v_perm_b32 함수는 HCC 컴파일러로 구현되지 않은 것 같습니다. 원시 어셈블리 명령어를 사용하여 수동으로 구현하는 방법이 있습니까? 나는 "asm"함수를 사용하여 장치 코드 내에서 "v_perm_b32"명령을 호출하는 것에 대해 생각하고 있었지만 분명히 HCC에서는 위법입니다. – ligosan

+0

Windows Visual Studio 지원이 없기 때문에 HCC 컴파일러에 대해 많이 알지 못합니다. 나는 C# (__asm4GCN)에서 그 가능성을 알고 있지만 그것은 아마도 당신이 찾고있는 것이 아닙니다. HCC 또는 OpenCL이 인라인 asm을 지원한다면 그것은 최고 일 것입니다! 그런데 어쩌면 v_perm_b32 지원을 HCC 컴파일러에 추가하도록 요청할 수 있습니다. (또는 더 나은 asm 지원) – Sunsetquest

관련 문제