매트릭스가 이미 GPU에 있습니까? 그렇지 않은 경우 CUBLAS는 추가 오버 헤드 인 thunking으로 알려진 메시지를 전송할 수 있습니다.
또한 작은 계산에서는 GPU가 실제로 빛나지 않습니다. 결과를 다시 전송해야하기 때문에 CPU보다 느릴 수 있습니다. 가능한 경우 더 큰 행렬을 사용하십시오. 그렇지 않으면 스트림 (cudaStream_t)을 사용하여 GPU에서 여러 개의 병렬 계산을 시작할 수 있습니다. 당신이 CUDA에서 커널의 실행 시간을 측정하려면
, 당신은 묶어야합니다 그 CUDA 런타임 API 사용하는 경우 다음과 같이 행사에 (또는 GPU에 계산 아무것도) :
cudaEvent_t start, stop;
cudaEventRecord(&start);
struct timeval cpuStart, cpuEnd;
gettimeofday(&cpuStart, 0); // get start time on CPU
// Do something with CUDA on the GPU, e.g. call kernels, transfer memory, ...
gettimeofday(&cpuEnd, 0); // get end time on CPU
double seconds = cpuEnd.tv_sec - cpuStart.tv_sec;
double microseconds = cpuEnd.tv_usec - cpuStart.tv_usec;
double cpuDuration = (seconds * 1.0e6 + microseconds)/1.0e3; // in milliseconds
cudaEventRecord(&stop);
// Wait until the stop event occurred
cudaError_t eventResult;
do
{
eventResult = cudaEventQuery(stop);
}
while (eventResult == cudaErrorNotReady);
// Assert there was no error; check the CUDA Toolkit Reference for further info
assert(cudaSuccess == eventResult); // requires #include <assert.h> or <cassert>
// Retrieve the time
float gpuDuration = 0.0; // in milliseconds
cudaEventElapsedTime(&gpuDuration, start, stop);
// Release the event objects
cudaEventDestroy(stop);
cudaEventDestroy(start);
을
당신은 이전 호출에서 오류가 발생할 수 있습니다으로 디버깅 시간의 결과로, (적어도 어설 포함) CUDA 모든 호출의 에러 코드를 확인 할 수 있습니다 ...
(참고 : 나는 주로 사용 CUDA 드라이버 API이므로 상자에서 작동하지 않을 수 있습니다. 죄송합니다.)
EDIT : 커널의 지속 시간이 아니라 호출 자체를 측정하고자하는 것을 보았습니다. 호출에 대한 CPU 시간 만 측정하면됩니다. 위의 업데이트 된 코드를 참조하십시오. Windows (AFAIK)에서는 gettimeofday를 사용할 수 없으므로이 기능은 Linux에서만 작동합니다.
CUDA에 작업을 보낼지 아니면 관심을 끌지 만 동적으로 작업을 선택할 수 있도록하려면? – Rup
@Rup : 전화가 실제로 들리는 것이 무엇인지 파악하는 데 관심이 있습니다. 느린 코드가 내 잘못인지 아니면 단순히 건축물의 제품인지 판단하십시오. –
소량의 데이터의 경우, 이는 여러분에게 피해를주는 오버 헤드뿐만 아니라 가능한 병렬 처리의 부족도 있습니다. GPU는 대기 시간을 숨기기에 충분한 스레드를 가지고 있습니다 (CPU가 GPU에서 많이 나빠집니다). 호출 오버 헤드가 없어도 작업이 ** 많은 스레드 **로 분할되어 있지 않으면 GPU가 CPU보다 느려질 수 있습니다. 많은 것은 쉽게 수천 개의 스레드를 의미 할 수 있습니다. – Grizzly