2012-06-22 3 views
1

저는 CUDA 프로그래밍에 익숙하지 않습니다. 성능상의 이유로 블록 당 공유 메모리로 작업하고 있습니다. 프로그램이 현재 구성되어있는 방식으로 하나의 커널을 사용하여 공유 메모리를로드하고 다른 커널을 사용하여 미리로드 된 공유 메모리를 읽습니다. 하지만 공유 메모리는 두 개의 다른 커널간에 유지 될 수 없습니다.영구 GPU 공유 메모리

나는 두 가지 해결책을 염두에두고 있습니다. 나는 첫번째 것에 대해 확신하지 못하고, 두번째는 느릴지도 모른다.

첫 번째 해결 방법 : 두 개의 커널을 사용하는 대신 하나의 커널을 사용합니다. 공유 메모리를 로딩 한 후, 커널은 호스트로부터의 입력을 기다리고 연산을 수행 한 다음 값을 호스트로 리턴 할 수 있습니다. 커널이 호스트로부터의 신호를 기다릴 수 있는지 확실하지 않습니다.

두 번째 해결 방법 : 공유 메모리를로드 한 후 공유 메모리 값을 전역 메모리에 복사합니다. 다음 커널이 시작되면 전역 메모리의 값을 다시 공유 메모리에 복사 한 다음 작업을 수행하십시오.

두 솔루션의 실현 가능성에 대해 의견을주십시오.

+0

왜 커널을 시작한 후 호스트 입력을 기다릴 필요가 있습니까? – pQB

+2

공유 메모리를 실제로 사용하지 말라고 생각하는 것처럼 들리 겠지요. compute capability> = 2.0의 디바이스를 목표로한다면, 처음에는 공유 메모리를 전혀 사용하는 것에 대해 걱정하지 마십시오. 대신'cudaFuncSetCacheConfig (MyKernel, cudaFuncCachePreferL1)'을 사용하여 L1 캐시에 대한 환경 설정을 지정하십시오. 알고리즘이 작동하면 CUDA 프로파일 러에서 앱을 실행하고 메모리 바운드인지 확인하십시오. 메모리 바운드 인 경우 공유 메모리를 사용하거나 L1을보다 효율적으로 사용하여 성능을 향상시킬 수있는 방법이 있는지 고려하십시오. –

답변

2

제안 된 첫 번째 해결책의 변형을 사용합니다. 이미 예상했듯이 커널에서 호스트 입력을 기다릴 수는 없지만 한 지점에서 커널을 syncronise 할 수는 있습니다. 그냥 "__syncthreads();"라고 부릅니다. 데이터를 공유 메모리에로드 한 후 커널에 저장하십시오.

두 번째 해결책을 잘 모르겠다. 첫 번째 커널의 전역 메모리로 데이터를 복사하기 위해 데이터를 공유 메모리로 복사해야하는 이유는 무엇입니까? 아니면이 첫 번째 커널도 뭔가 계산할 것입니까? 이 경우 공유 메모리에 예비 결과를 저장하는 데 도움이되지 않을 것 같아요. 대신 전역 메모리에 직접 저장하는 것이 좋습니다 (그러나 알고리즘에 따라 다를 수 있음).