2016-08-18 315 views
1

我最近开始Cuda并研究过样品。我觉得有点奇怪。DirectX和Cuda性能

在'fluidsD3D9'样本中,DirectX目前的检测需要15〜20 milisec。 我检查时间如下面的源代码。

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'样本上。 看来这个块发生在'fluidD3D9'样本。因为这个时候,FPS也不同于DirectX和OpenGL Sample。

我该如何解决这个问题?

enter image description here enter image description here

回答

0

这也不是什么问题。这更多的是驱动程序设计和优化的差异。所有的D3D调用都不会有太多的功能,当您调用Present时,您最终会刷新之前排队的大部分帧。当然你可能做了一些让它现在比它应该更大的东西,但它是一个黑匣子,即使有nvidia的支持,通常也很难获得它。

在附注中,d3d9相当陈旧,驱动程序可能不如以前使用现代操作系统时的好,现在任何d3d开发都应该使用d3d11(以及使用d3d12的1%)。

2

您应该阅读本MSDN文章,了解为什么您的计时方法无效:Accurately Profiling Direct3D API Calls (Direct3D 9)。总之,由于Direct3D大量批量尝试避免内核转换开销,并且GPU通常与CPU不同步,因此无法轻松预测何时GPU工作实际上正在启动。

正如其他人指出的,Direct3D 9是古老的,并不真正支持GPGPU。有关更多苹果与苹果的比较,请尝试DirectX 11 DirectCompute示例FluidCS11