해결된 질문
작성
·
286
0
안녕하세요?
Jetson TX2 및 Xavier를 사용하여 CUDA예제를 실행하고 있습니다.
Block 예제에서 tx2와 xavier의 결과가 달라서 질문드립니다.
dimgrid<<<2,2,1>>>에 의해 Block의 갯수가 4개가 되고, warpid=0인 영역은 blockid가 (0,0), (1,0), (0,1), (1,1)인 곳에서 총 4개가 있을 것입니다.
하지만 Tx2에서 예제를 돌려본 결과 blockid가 (0,0), (1,0)인 곳에만 나옵니다.
혹시나 해서 xavier에서 실험을 해본 결과 총 4개가 나와 정상적으로 출력됩니다.
CUDA언어는 GPU구조와 상관 없이 출력되기 위해 grid-block-thread 구조를 가지므로 속도는 느리지만 동일한 결과를 출력해야하는데, 왜 tx2와 xavier가 같은 예제를 돌렸는데도 다른 결과가 나오는걸까요?
(혹시나 해서 <<<2,2,1>>> => <<<4,1,1>>>로 변경하여 돌려봤지만 여전히 tx2에서 blockid 2개만 출력되었습니다.)
답변 1
0
안녕하세요.
우선, CUDA 프로그래밍 강의를 수강해 주셔서 감사합니다.
제가 가진 하드웨어 환경에서는 말씀하신 내용을 재현할 수가 없어서,
정확한 답변을 드리기는 힘들다는 점은 양해를 부탁 드립니다.
말씀하신 상황에 대해서, 몇가지 가능성을 생각해 볼 수 있습니다.
우선, 정말로 TX2 에서 Thread Block 이 제대로 생성되지 않는다면?
TX2 모델이 출시된지가 몇년 되었다는 점을 고려하면,
실제로 이런 치명적인 문제가 있지는 않을 것이라고 생각됩니다.
있었더라도 출시 후 몇년이 지난 지금 시점에는 해결되었을 것으로 보입니다.
그러면, 제대로 생성되었다면, 왜 block id 는 제대로 나오지 않았을까?
추측할 수 있는 것은 CUDA printf 문장이 제대로 작동하지 않았을 가능성입니다.
CUDA 의 초기 버전들에서는 printf 문장이 원래 없었고,
현재도 printf 문장은 CUDA 나 GPU 가 직접 처리하기는 곤란한 구조입니다.
그래서, 가끔 이쪽에서 출력이 제대로 안 나왔다는 내용들이 나옵니다.
cudaDeviceSynchronize(); 함수를 kernel 수행 이후에 적절히 추가해서
해결했다는 보고들도 있고, CUDA hardware architecture에 따라 결과가 다르게 나와서,
CUDA hardware architecture 를 compile 시에 강제로 설정해서 해결했다는 보고들도 있습니다.
제공되는 소스코드들에서, print 출력 외에, 다른 계산 결과들은 제대로 나왔는지 체크가 필요하고,
아마도 TX2 모델에서의 CUDA 버그나, CUDA 프로그래밍 시에 유의할 점 같은 리포트들이 없었던 것을 고려하면,
printf 출력 상의 문제였을 가능성이 커 보입니다.
계속해서 다른 프로그램들에서도 계산 결과에 문제가 있다면, 다시 알려주시면 감사하겠습니다.
저도 TX2 하드웨어나 관련 내용을 계속 추적해 보겠습니다.
감사합니다.