2016-08-18 8 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サンプルが異なります。

どうすればこの問題を解決できますか?

enter image description here enter image description here

答えて

0

これはまさに問題ではありません。これはドライバの設計と最適化の違いです。すべてのD3Dコールはあまり効果がありません。Presentにコールすると、前にキューに入れられたフレームの大部分がフラッシュされます。確かにあなたは現在よりも大きなものを作っているかもしれないが、それはブラックボックスであり、NVIDIAのサポートでさえも、それを乗り越えるのは難しいことが多い。

d3d9はかなり古く、ドライバは現代のOSよりもあまり良くないかもしれません。どんなd3d開発でもd3d11(そしてd3d12を使って1%)を使うべきです。

2

タイミングアプローチが機能しない理由については、このMSDNの記事をお読みください。Accurately Profiling Direct3D API Calls (Direct3D 9)要するに、GPUの作業が実際にDirect3Dのバッチとして頻繁に開始され、カーネルの移行のオーバーヘッドを回避しようとするのは簡単に予測できず、GPUは通常CPUと同期していません。

他の人が指摘したように、Direct3D 9は古く、実際にはGPGPUをサポートしていません。より多くのリンゴとリンゴの比較を行うには、DirectX 11 DirectComputeサンプルFluidCS11を試してみてください。