programing

printfinside CUDA __global__ 기능

css3 2023. 10. 7. 12:08

printfinside CUDA __global__ 기능

저는 현재 GPU에 매트릭스 곱셈을 작성하고 있으며 코드를 디버그하고 싶습니다. 하지만 장치 기능 내부에서 printf를 사용할 수 없기 때문에 해당 기능 내부에서 무슨 일이 일어나고 있는지 확인할 수 있는 다른 방법이 있을까요?현재 사용 중인 기능:

__global__ void MatrixMulKernel(Matrix Ad, Matrix Bd, Matrix Xd){

    int tx = threadIdx.x;
    int ty = threadIdx.y;

    int bx = blockIdx.x;
    int by = blockIdx.y;

    float sum = 0;

    for( int k = 0; k < Ad.width ; ++k){
        float Melement = Ad.elements[ty * Ad.width + k];
        float Nelement = Bd.elements[k * Bd.width + tx];
        sum += Melement * Nelement;
    }

    Xd.elements[ty * Xd.width + tx] = sum;
}

저는 Ad와 Bd가 제가 생각하는 그대로인지 알고 싶고, 그 기능이 실제로 호출되고 있는지 확인하고 싶습니다.

CUDA에서 지원합니다.printfs가 커널에 직접 들어옵니다.공식적인 설명은 CUDC 프로그래밍 가이드의 부록 B.16을 참조합니다.

편집

사람들을 오도하는 것을 피하기 위해, M.Tibbits는 printf가 컴퓨팅 기능 2.0 이상의 모든 GPU에서 사용 가능하다고 지적합니다.

편집 종료

선택할 수 있습니다.

  • GPU 디버거 사용(예: Linux의 경우 cuda-gdb 또는 Windows의 Nexus)
  • 등록된 개발자가 사용할 수 있는 cuprintf 사용 (여기에 가입)
  • 보고 싶은 데이터를 수동으로 복사한 다음 커널이 완료된 후 해당 버퍼를 호스트에 덤프합니다(동기화해야 함).

코드 조각 관련:

  • 통과를 고려해 보십시오.Matrix포인터(즉, 포인터)를 통해 구조화합니다.cudaMemcpy장치로 보낸 다음 장치 포인터를 전달합니다). 지금 당장은 문제가 없겠지만 기능 서명이 매우 커지면 256바이트 제한에 도달할 수 있습니다.
  • Ad의 읽기가 비효율적이므로 Melement로 읽을 때마다 메모리에 대한 32바이트 트랜잭션이 발생합니다. 공유 메모리를 스테이징 영역으로 사용하는 것을 고려하십시오(SDK에서 new sample의 transpose).
  • 컵프린트
  • Nexus http://developer.nvidia.com/object/nexus.html 를 사용해 보십시오.

그나저나..

  • 공유 메모리 사용
  • 고리 밖으로 곱셈
  • 이것을 보세요: http://www.seas.upenn.edu/ ~cis665/LECTURES/LeCTURES11.ppt

CUDAC 프로그래밍 가이드의 "포맷된 출력"(현재 B.17) 섹션을 참조하십시오.

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

언급URL : https://stackoverflow.com/questions/2173771/printf-inside-cuda-global-function