사람들이 C 코드에서 인라인 PTX 어셈블리 코드를 사용하는 코드 샘플을 보았습니다. CUDA 툴킷의 Doc는 PTX가 강력하다는 것을 언급합니다. 왜 그렇습니까? C 코드에서 그러한 코드를 사용하면 어떤 이점이 있습니까?인라인 PTX 어셈블리 코드가 강력합니까?
답변
인라인 PTX를 사용하면 CUDA intrinsincs를 통해 노출되지 않는 명령어에 액세스 할 수 있으며 컴파일러에 없거나 언어 사양에서 금지 된 최적화를 적용 할 수 있습니다. 인라인 PTX를 사용하는 작업 예제에서는 다음을 참조하십시오. 캐리 플래그에 직접 액세스 할 수 있으므로 인라인 PTX를 사용하는 128 비트 덧셈에 단 4 개의 명령어가 필요합니다. 주어진 하드웨어 플랫폼은 캐리 플래그 (예 : MIPS), 단일 캐리 플래그 (예 : x86, sm_2x) 또는 다중 캐리 플래그를 가질 수 없으므로 HLL로서 C/C++은 캐리 플래그에 대한 표현을 가지고 있지 않습니다. 다음 128 비트 덧셈과 뺄셈의 4 명령어 PTX 버전과는 대조적으로, 이러한 작업은 C로 코딩 될 수있다 :
#define SUBCcc(a,b,cy,t0,t1,t2) \
(t0=(b)+cy, t1=(a), cy=t0<cy, t2=t1<t0, cy=cy+t2, t1-t0)
#define SUBcc(a,b,cy,t0,t1) \
(t0=(b), t1=(a), cy=t1<t0, t1-t0)
#define SUBC(a,b,cy,t0,t1) \
(t0=(b)+cy, t1=(a), t1-t0)
#define ADDCcc(a,b,cy,t0,t1) \
(t0=(b)+cy, t1=(a), cy=t0<cy, t0=t0+t1, t1=t0<t1, cy=cy+t1, t0=t0)
#define ADDcc(a,b,cy,t0,t1) \
(t0=(b), t1=(a), t0=t0+t1, cy=t0<t1, t0=t0)
#define ADDC(a,b,cy,t0,t1) \
(t0=(b)+cy, t1=(a), t0+t1)
unsigned int cy, t0, t1, t2;
res.x = ADDcc (augend.x, addend.x, cy, t0, t1);
res.y = ADDCcc (augend.y, addend.y, cy, t0, t1);
res.z = ADDCcc (augend.z, addend.z, cy, t0, t1);
res.w = ADDC (augend.w, addend.w, cy, t0, t1);
res.x = SUBcc (minuend.x, subtrahend.x, cy, t0, t1);
res.y = SUBCcc (minuend.y, subtrahend.y, cy, t0, t1, t2);
res.z = SUBCcc (minuend.z, subtrahend.z, cy, t0, t1, t2);
res.w = SUBC (minuend.w, subtrahend.w, cy, t0, t1);
아마 약 3 ~ 4 배 개수로 컴파일 위에 가감 해당 인라인 PTX 버전에서 사용하는 명령어
성능은 어떻습니까? 이러한 코드 삽입으로 성능이 향상됩니까? –
필자가 지적한 예에서 인라인 PTX를 사용하면 필요한 명령어 수를 최소화 할 수 있습니다. 이는 앱의 명령어 처리량이 제한적일 경우 앱 성능을 향상시킵니다. 명백하게 눈에 띄는 이점을 제공하는 곳에서만 낮은 수준의 인터페이스를 사용하고자하지만, 이는 모든 플랫폼에서 인라인 어셈블리를 사용하는 경우에도 적용됩니다. 조숙 한 최적화에 대한 표준 경고가 적용됩니다. – njuffa
- 1. 병렬 Nsight에서 인라인 PTX 디버깅
- 2. 인라인 어셈블리
- 3. 인라인 어셈블리
- 4. 인라인 어셈블리, SEHException
- 5. Watcom 인라인 어셈블리 문서
- 6. 인라인 어셈블리 오류
- 7. 루프 내부의 인라인 어셈블리
- 8. 인라인 어셈블리 코드 바꾸기
- 9. x64를 지원하도록 인라인 어셈블리 번역
- 10. ICC 인라인 어셈블리에 대한 GCC 인라인 어셈블리
- 11. Xcode를 사용하여 인라인 어셈블리 디버깅
- 12. 인라인 어셈블리 GCD가 작동하지 않습니다.
- 13. C 인라인 어셈블리 메모리 복사본
- 14. C 인라인 어셈블리 레이블 문제
- 15. GCC 인라인 어셈블리 스팍 아키텍처
- 16. gcc의 인텔 스타일 인라인 어셈블리
- 17. 컨텍스트 스위칭을위한 gcc 인라인 어셈블리
- 18. GCC를 사용하여 어셈블리 출력으로 인라인 라인을 인라인 할 수 있습니까?
- 19. gcc 컴파일 시도를 방해하는 인라인 어셈블리 오류
- 20. 이 코드가 계산하도록되어이 어셈블리 코드
- 21. C++ 코드가 어셈블리 코드로 컴파일됩니까?
- 22. 왜이 어셈블리 코드가 더 빠릅니까?
- 23. PHP는 충분히 강력합니까?
- 24. 어떤지도 API가 가장 강력합니까?
- 25. 첫 번째 어셈블리 프로그램 (GCC 인라인 어셈블리)에서 오류가 발생했습니다.
- 26. CUDA C에서 ptx 함수를 호출하려면 어떻게해야합니까?
- 27. C/C++에서 인라인 어셈블리 사용
- 28. GCC 인라인 어셈블리 : 전화 DWORD PTR
- 29. 로컬 변수 및 인라인 어셈블리 스레드
- 30. C++ 인라인 어셈블리 : 참조를 다루는 방법?
이 질문은 "긴 문자열입니까?"라는 질문과 조금 다릅니다. 확실한 답이 없습니다. 컴파일러에 의해 방출되는 PTX 명령어를 명시 적으로 제어하는 것이 유익하고 필요한 상황과 그렇지 않은 상황이있을 수 있습니다. PTX는 여전히 GPU가 실행하는 코드의 중간 표현 일뿐입니다. – talonmies
나는 PTX의 힘을 보여줄 수있는 몇 가지 예를 기대하고 있었는데, 그것은 내가 확신했을 것이다. 일반적인 질문이지만 PTX를 사용하면 CUDA-C가 제공 할 수없는 추가적인 힘을 줄 수 있다는 자신을 확신 할 수있는 몇 가지 예가 필요합니다. –
인라인 PTX는 CUDA intrinsincs를 통해 공개되지 않는 지침에 대한 액세스를 제공하며, 컴파일러에서 부족하거나 언어 사양에서 금지 된 최적화 인라인 PTX 사용이 유리한 작업 예제는 다음을 참조하십시오. http://stackoverflow.com/questions/6162140/128-bit-integer-on-cuda/6220499#6220499 – njuffa