2011-07-30 5 views
1

대역폭을 테스트하기 위해 일부 커널을 만들었지 만 유용한 계산이 아닙니다. 변수 "x"를 설정했지만 CUDA에서 사용하지 않는 변수 유지하기

을 사용한 적이 커널은 신속하게 실행 : 최소한의 예를 들어 내가 컴파일 할 때, 나는 (당연한)

경고를

__global__ void testKernel(float* a) 
{ 
    unsigned int i = blockIdx.x*blockDim.x + threadIdx.x; 
    float x; 
    x = a[i]; 
} 

입니다 빈 커널로 :

__global__ void donothing() 
{ 
} 

이것은 [i]의 읽기가 선택되었음을 나타냅니다. 밖으로 imized.

내가 시도 트릭은

volatile float x; 

if(x); 

(void)(x;) 

과 그들이 경고를 억제하지만, 커널은 여전히 ​​너무 빨리 완료됩니다.

쓸데없는 명령어가 실제로 실행되도록하려면 어떻게해야합니까?

옵션 CU_JIT_OPTIMIZATION_LEVEL을 (를) 찾았지만 Google에서 주로 설명서 링크를 제공하고 사용 방법은 제공하지 않습니다. 이 옵션이 도움이 되겠습니까? 어떻게 사용합니까? 변수를 저장하는 브랜치 도입

+0

저는 항상 이러한 것들을 유용하게 만들었으므로 그것을 제거 할 수 없습니다. 이것이 당신을위한 선택입니까? – Patrick87

+0

시도 x = a [i] + 0 –

+0

@Pavan 도움이되지 않습니다. x는 아직 사용되지 않습니다. – stardt

답변

2

시도는 :

__global__ void testKernel(float* a, float *b) 
{ 
    unsigned int i = blockIdx.x*blockDim.x + threadIdx.x; 
    float x; 
    x = a[i]; 

    if(b) 
    { 
     *b = x; 
    } 
} 

메모리 전송의 비용에 비해 분기 비용은 무시할 수있다. 커널 발사 기지에서

, 단순히 널 포인터를 전달 : 당신의 부하가 제거해서는 안 컴파일러가 쓸모가 증명할 수 없기 때문에

testKernel<<<...>>>(a, static_cast<float*>(0)); 

NVCC는,이 단위에서 constant folding을 수행하지 않습니다.

+0

'if (threadIdx.x> -2) {}'또는 다른 것을 사용하여 컴파일러를 속여서 주위에 코드. – harrism

+0

실제로 무언가를하는 코드를 추가하지 않고 최적화를 막을 수 있습니까? – stardt

+0

@stardt로드 된 값을 어떤 식 으로든 사용하는 방법을 도입하지 않으면이를 수행하는 방법을 알지 못합니다. –

관련 문제