programing

CUDA의 __공유_메모리는 언제 유용합니까?

iphone6s 2023. 10. 14. 09:54
반응형

CUDA의 __공유_메모리는 언제 유용합니까?

공유 메모리 사용법에 대한 아주 간단한 예를 들어줄 수 있는 사람이 있습니까?Cuda C programming guide에 포함된 예제는 관련 없는 세부사항들로 인해 어수선해 보입니다.

예를 들어 큰 배열을 장치 전역 메모리에 복사하고 각 요소를 제곱하려면 공유 메모리를 어떻게 사용하여 속도를 높일 수 있습니까?아니면 이 경우에 유용하지 않습니까?

언급한 특정한 경우 공유 메모리는 다음과 같은 이유로 유용하지 않습니다. 각 데이터 요소는 한 번만 사용됩니다.공유 메모리가 유용하려면 좋은 액세스 패턴을 사용하여 공유 메모리에 전송된 데이터를 여러 번 사용해야 도움이 됩니다.그 이유는 간단합니다. 글로벌 메모리에서 읽기만 해도 글로벌 메모리 읽기 1개와 공유 메모리 읽기 0개가 필요합니다. 먼저 공유 메모리로 읽기만 하면 글로벌 메모리 읽기 1개와 공유 메모리 읽기 1개가 필요하므로 더 오랜 시간이 걸립니다.

블록의 각 스레드가 해당 값인 제곱을 계산하고 왼쪽 및 오른쪽 이웃 모두의 평균인 제곱을 계산하는 간단한 예는 다음과 같습니다.

  __global__ void compute_it(float *data)
  {
     int tid = threadIdx.x;
     __shared__ float myblock[1024];
     float tmp;

     // load the thread's data element into shared memory
     myblock[tid] = data[tid];

     // ensure that all threads have loaded their values into
     // shared memory; otherwise, one thread might be computing
     // on unitialized data.
     __syncthreads();

     // compute the average of this thread's left and right neighbors
     tmp = (myblock[tid > 0 ? tid - 1 : 1023] + myblock[tid < 1023 ? tid + 1 : 0]) * 0.5f;
     // square the previousr result and add my value, squared
     tmp = tmp*tmp + myblock[tid] * myblock[tid];

     // write the result back to global memory
     data[tid] = tmp;
  }

이것은 오직 하나의 블록만을 사용하여 작동하도록 구상되어 있습니다.더 많은 블록에 대한 확장은 간단해야 합니다.블록 치수(1024, 1, 1) 및 그리드 치수(1, 1, 1)를 가정합니다.

공유 메모리를 명시적으로 관리되는 캐시로 생각합니다. 동일한 스레드 내에서 또는 동일한 블록 내의 다른 스레드에서 두 번 이상 데이터에 액세스해야 하는 경우에만 유용합니다.데이터에 한 번만 액세스하는 경우 공유 메모리는 도움이 되지 않습니다.

언급URL : https://stackoverflow.com/questions/8011376/when-is-cudas-shared-memory-useful

반응형