2017-01-08 6 views
-1

저는 CUDA 프로그래밍이 처음이었고 실행 시간의 차이를보기 위해 다른 간단한 커널을 테스트했습니다. 최적화 및 얻을 없애 내가 -g -G와 함께 컴파일mod 대신 bitwise shift를 사용하는 동안 CUDA의 중요한 시간 차이

__global__ void mathKernel4(float *c) 
{ 
    int tid = blockIdx.x * blockDim.x + threadIdx.x; 
    float ia, ib; 
    ia = ib = 0.0f; 

    int itid = tid >> 5; 

    if (itid & 0x01 == 0) 
    { 
     ia = 100.0f; 
    } 
    else 
    { 
     ib = 200.0f; 
    } 

    c[tid] = ia + ib; 
} 

:

__global__ void mathKernel2(float *c) 
{ 
int tid = blockIdx.x * blockDim.x + threadIdx.x; 
float ia, ib; 
ia = ib = 0.0f; 

    if ((tid/warpSize) % 2 == 0) 
    { 
     ia = 100.0f; 
    } 
    else 
    { 
     ib = 200.0f; 
    } 

    c[tid] = ia + ib; 
} 

다른 하나

은 나를 위해 동일한 작업을 수행 개의 커널을 가지고 :

mathKernel2 <<< 8192 32 >>> elapsed 0.000259 sec 
mathKernel4 <<< 8192 32 >>> elapsed 0.000103 sec 

왜 큰 차이가 있습니까?

+0

밀리 초보다 적습니다. 정말 중요합니까? – Moira

+3

정수 모듈러스 연산자가 GPU에서 느린 것으로 알려져 있습니다. – talonmies

+0

@ 1blustone이이 경우에는 아닐 수도 있지만, 차이가 있습니다. –

답변

3

이 라인 : false 및 분기의 하나에 컴파일시 평가

if (itid & (0x01 == 0)) 

제거된다

if (itid & 0x01 == 0) 

같이 읽는다.

비트 단위 이진 연산자는 C/C++ 및 CUDA에서 다소 우선 순위가 낮습니다.

+2

이 최적화는 디버그 코드가 아닌 완전히 최적화 된 코드에서만 발생할 수 있다고 생각합니다. OP의 질문은 특히 디버그 모드에서 동작을 이해하려고합니다. 이 코드를'-G'로 큐빈에 컴파일 한 다음'cuobjdump -sass'를 실행하면, 부동 소수점 값 할당과 코드와 브랜치 양쪽 모두가 브랜치에 의해 제어된다. '명령. 이것이 최적화되지 않은 경우의 행동에 대한 설명이라고는 분명하지 않습니다. –

+0

맞습니다. -G 플래그에주의를 기울이지 않았습니다. 이 경우 modulo가 문제가 될 수 있으며 shr에 최적화되지 않습니다. 즉, 두 커널은 똑같은 일을하지 않습니다. – CygnusX1