2016-08-18 6 views
1

최근에 Cuda를 시작하고 샘플을 연구했습니다. 나는 다소 이상한 것을 알았다.DirectX 및 Cuda 성능

'fluidsD3D9'샘플의 DirectX 현재 사용 시간은 15 ~ 20 밀리 초입니다. 아래의 소스 코드와 같은 시간을 확인했습니다.

LARGE_INTEGER start, end, f; 
QueryPerformanceFrequency(&f); 
QueryPerformanceCounter(&start); 
hr = g_pD3DDevice->Present(NULL, NULL, NULL, NULL); 
QueryPerformanceCounter(&end); 

float finterval = (float)(end.QuadPart - start.QuadPart)/
        (float)(f.QuadPart/1000); 

printf("\nPresent : %f\n", finterval); 

하지만 SwapBuffer는 'fluidsGL'샘플에서 시간이 걸리지 않습니다. 'fluidsD3D9'샘플에서 블록이 발생하는 것으로 보입니다. FPS도이 시간 때문에 DirectX 및 OpenGL Sample과 다릅니다.

이 문제를 어떻게 해결할 수 있습니까?

enter image description here enter image description here

답변

0

이 정확히 문제가되지 않습니다. 그것은 드라이버 설계와 최적화의 차이입니다. 모든 D3D 호출은 그리 많은 일을하지 않으며 Present를 호출하면 이전에 대기중인 프레임의 대부분을 비울 수 있습니다. 물론 당신은 현재보다 더 큰 선물을 만들었지 만 블랙 박스이고 엔비디아 지원이 있어도 종종 타기는 어렵습니다.

d3d9는 상당히 오래된 드라이버이며 현대 OS보다 드라이버가 덜 좋을 수 있습니다. 따라서 모든 d3d 개발에서는 d3d11 (그리고 1 %는 d3d12 사용)을 사용해야합니다.

2

타이밍 접근 방식이 작동하지 않는 이유에 대해서는이 MSDN 문서를 읽어야합니다 : Accurately Profiling Direct3D API Calls (Direct3D 9). 간략히 말하자면, GPU 작업이 실제로 Direct3D 배치로 시작되어 커널 전환 오버 헤드를 피하려고 시도하는 것을 쉽게 예측할 수 없으며 GPU는 대개 CPU와 동기화되지 않습니다.

다른 사람이 지적했듯이 Direct3D 9는 고대이며 GPGPU를 실제로 지원하지 않습니다. 더 많은 사과 - 사과 비교를 위해 DirectX 11 DirectCompute 샘플 FluidCS11을 사용해보십시오.