2016-08-18 4 views
1

Ich begann Cuda vor kurzem und studierte Proben. Ich fand etwas seltsam.DirectX und Cuda Leistung

Bei 'fluidsD3D9' Probe DirectX vorhanden Funktion dauert 15 ~ 20 Millisek. I Checked Zeit wie der Quellcode unten.

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); 

Aber SwapBuffer braucht keine Zeit bei 'FluidsGL' Probe. Es scheint, dass Block bei 'FluidsD3D9' Probe auftritt. FPS unterscheiden wegen dieser Zeit auch DirectX und OpenGL Sample.

Wie kann ich dieses Problem lösen?

enter image description here enter image description here

Antwort

0

Dies ist nicht gerade ein Problem. Es ist mehr ein Treiberdesign und Optimierungsunterschied. Alle D3D-Aufrufe machen nicht viel, und wenn Sie Present aufrufen, wird der größte Teil eines zuvor in die Warteschlange eingereihten Frames gelöscht. Sicher hast du etwas gemacht, was die Gegenwart größer macht, als es sollte, aber es ist eine Blackbox und selbst mit Nvidia-Unterstützung ist es oft schwierig, sich davon zu befreien.

Nebenbei bemerkt, d3d9 ist ziemlich alt, und der Treiber kann weniger gut sein als früher mit dem modernen Betriebssystem, jede d3d-Entwicklung sollte jetzt d3d11 verwenden (und die 1% mit d3d12).

2

Sie sollten diesen MSDN-Artikel lesen, warum Ihr Timing-Ansatz nicht funktioniert: Accurately Profiling Direct3D API Calls (Direct3D 9). Kurz gesagt, Sie können nicht einfach vorhersagen, wann die GPU-Arbeit tatsächlich als Direct3D-Charge gestartet wird, um den Overhead des Kernel-Übergangs zu vermeiden, und die GPU ist normalerweise nicht mit der CPU synchronisiert.

Wie bereits erwähnt, ist Direct3D 9 alt und unterstützt GPGPU nicht wirklich. Probieren Sie das DirectX 11 DirectCompute-Beispiel FluidCS11 für einen Äpfel-zu-Äpfel-Vergleich aus.