2016-08-18 2 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». Кажется, что блок встречается на образце «fluidsD3D9». FPS также отличаются DirectX и OpenGL Sample из-за этого времени.

Как я могу решить эту проблему?

enter image description here enter image description here

ответ

0

Это не совсем проблема. Это больше разница в дизайне и оптимизации драйверов. Все вызовы D3D не делают многого, и когда вы вызываете «Present», вы в конечном итоге смываете большую часть фрейма, который раньше был поставлен в очередь. Конечно, вы, возможно, сделали что-то, что делает подарок больше, чем нужно, но это черный ящик и даже с поддержкой nvidia, часто бывает трудно прокатиться по нему.

На боковой ноте d3d9 довольно старый, и драйвер может быть менее хорошим, чем когда-либо с современной ОС, любая разработка d3d теперь должна использовать d3d11 (и 1% с помощью d3d12).

2

Вы должны прочитать эту статью MSDN о том, почему ваш подход к синхронизации не работает: Accurately Profiling Direct3D API Calls (Direct3D 9). Короче говоря, вы не можете легко предсказать, когда на самом деле происходит работа с GPU, поскольку Direct3D сильно загружается, чтобы попытаться избежать накладных расходов ядра, а графический процессор обычно не синхронизируется с процессором.

Как отметил еще один человек, Direct3D 9 является древним и на самом деле не поддерживает GPGPU. Для сравнения большего количества яблок и яблок попробуйте образец DirectX 11 DirectCompute FluidCS11.

Смежные вопросы