2012-09-16 3 views
2

사람들이 C 코드에서 인라인 PTX 어셈블리 코드를 사용하는 코드 샘플을 보았습니다. CUDA 툴킷의 Doc는 PTX가 강력하다는 것을 언급합니다. 왜 그렇습니까? C 코드에서 그러한 코드를 사용하면 어떤 이점이 있습니까?인라인 PTX 어셈블리 코드가 강력합니까?

+5

이 질문은 "긴 문자열입니까?"라는 질문과 조금 다릅니다. 확실한 답이 없습니다. 컴파일러에 의해 방출되는 PTX 명령어를 명시 적으로 제어하는 ​​것이 유익하고 필요한 상황과 그렇지 않은 상황이있을 수 있습니다. PTX는 여전히 GPU가 실행하는 코드의 중간 표현 일뿐입니다. – talonmies

+0

나는 PTX의 힘을 보여줄 수있는 몇 가지 예를 기대하고 있었는데, 그것은 내가 확신했을 것이다. 일반적인 질문이지만 PTX를 사용하면 CUDA-C가 제공 할 수없는 추가적인 힘을 줄 수 있다는 자신을 확신 할 수있는 몇 가지 예가 필요합니다. –

+2

인라인 PTX는 CUDA intrinsincs를 통해 공개되지 않는 지침에 대한 액세스를 제공하며, 컴파일러에서 부족하거나 언어 사양에서 금지 된 최적화 인라인 PTX 사용이 유리한 작업 예제는 다음을 참조하십시오. http://stackoverflow.com/questions/6162140/128-bit-integer-on-cuda/6220499#6220499 – njuffa

답변

8

인라인 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 버전에서 사용하는 명령어

+0

성능은 어떻습니까? 이러한 코드 삽입으로 성능이 향상됩니까? –

+1

필자가 지적한 예에서 인라인 PTX를 사용하면 필요한 명령어 수를 최소화 할 수 있습니다. 이는 앱의 명령어 처리량이 제한적일 경우 앱 성능을 향상시킵니다. 명백하게 눈에 띄는 이점을 제공하는 곳에서만 낮은 수준의 인터페이스를 사용하고자하지만, 이는 모든 플랫폼에서 인라인 어셈블리를 사용하는 경우에도 적용됩니다. 조숙 한 최적화에 대한 표준 경고가 적용됩니다. – njuffa

관련 문제