인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

rkdghrk12님의 프로필 이미지

작성한 질문수

CUDA 프로그래밍 (2) - C/C++/GPU 병렬 컴퓨팅 - 벡터 vector 더하기

15강 Block ID 예제 오류 질문입니다.

해결된 질문

작성

·

315

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 하드웨어나 관련 내용을 계속 추적해 보겠습니다.

 

감사합니다.