2016-11-17 10 views
1

가정하자 나는 다음과 같이 메모리 액세스를 스트라이드 수행 커널이 있습니다효과적인 메모리 대역폭

__global__ void strideExample (float *outputData, float *inputData, int stride=2) 
{ 
     int index = (blockIdx.x * blockDim.x + threadIdx.x) * stride; 
     outputData[index] = inputData[index]; 
} 

내가 그 50 %로드/저장 효율됩니다 2의 보폭 크기 액세스 이해를 왜냐하면 트랜잭션과 관련된 요소의 절반이 사용되지 않기 때문에 (낭비되는 대역폭으로). 보다 큰 보폭에 대한로드/스토어 효율을 계산하려면 어떻게해야합니까? 미리 감사드립니다! 일반적으로

답변

3

:

requested loads 소프트웨어 effective loads은 하드웨어가 실제로 을 읽을 수 있었다 바이트 수를 읽어 요청 바이트 수
load efficiency = requested loads/effective loads 

. 상점에 동일한 수식이 적용됩니다.

완벽 합체 액세스는 1

에 코드를 요청 정확히 (blockIdx.x * blockDim.x + threadIdx.x) * sizeof(float) 바이트의 효율을 가지고있다. outputData이 올바르게 정렬되었다고 가정하면 (cudaMalloc에 의해 반환 된 포인터와 마찬가지로) 하드웨어는 트랜잭션 크기 (SM/L1의 경우 128 바이트, L1/L2의 경우 32 바이트)로 반올림하여 (blockIdx.x * blockDim.x + threadIdx.x) * sizeof(float) * stride 바이트를 읽어야합니다.

블록 크기가 충분히 크다고 가정하면 트랜잭션 크기로의 반올림은 무시할 수있게되고 방정식은 단지 1/stride으로 단순화 할 수 있습니다.이 경우 부하 효율은 약 16.7 %입니다.

+0

감사합니다. 위의 질문에서 스트라이드 크기가 6이라고 가정하면 부하 효율성을 어떻게 계산합니까? –

+0

CUDA Compute Cabability 1.1 및 1.2와 동일합니까? –

+0

예, 모든 컴퓨팅 기능에서 동일하게 작동합니다. 1.0 및 1.1에서는 트랜잭션 크기가 약간 다르지만 일반적인 개념은 동일합니다. –