DirectX 11.1尝试创建设备以不触发超时检测恢复

时间:2012-12-10 14:31:04

标签: visual-c++ directx directx-11 c++-amp

我正在尝试使用C ++ AMP在GPU上执行长时间运行的内核。这需要使用DirectX创建一个不会超时的设备。我正在设置标志但它仍然触发超时检测恢复。我的盒子里有一个专用的Radeon HD 7970,没有插入显示器。还有什么我需要做的,以防止Windows 8在完成之前取消我的内核吗?

#include <amp.h>
#include <amp_math.h>
#include <amp_graphics.h>
#include <d3d11.h>
#include <dxgi.h>

#include <vector>
#include <iostream>
#include <iomanip>
#include "amp_tinymt_rng.h"
#include "timer.h"
#include <assert.h>

#pragma comment(lib, "d3d11")
#pragma comment(lib, "dxgi")

//Inside Main()
    unsigned int createDeviceFlags = D3D11_CREATE_DEVICE_DISABLE_GPU_TIMEOUT;
    ID3D11Device * pDevice = nullptr;
    ID3D11DeviceContext * pContext = nullptr;
    D3D_FEATURE_LEVEL targetFeatureLevels = D3D_FEATURE_LEVEL_11_1;
    D3D_FEATURE_LEVEL featureLevel;
    auto hr = D3D11CreateDevice(pAdapter, 
                            D3D_DRIVER_TYPE_UNKNOWN, 
                            nullptr, 
                            createDeviceFlags, 
                            &targetFeatureLevels, 
                            1, 
                            D3D11_SDK_VERSION, 
                            &pDevice, 
                            &featureLevel, 
                            &pContext);

    if (FAILED( hr) || 
        ( featureLevel != D3D_FEATURE_LEVEL_11_1))
    { 
        std:: wcerr << "Failed to create Direct3D 11 device" << std:: endl; 
        return 10; 
    }

accelerator_view noTimeoutAcclView = concurrency::direct3d::create_accelerator_view(pDevice);
wcout << noTimeoutAcclView.accelerator.description;

//Setup kernal here
concurrency::parallel_for_each(noTimeoutAcclView, e_size, [=] (index<1> idx) restrict(amp) {
   //Execute kernel here
});

1 个答案:

答案 0 :(得分:2)

你的代码片看起来不错,问题必须在别的地方。以下是一些想法:

  • 请仔细检查所有parallel_for_each调用并确保 他们都将accelerator_view与您创建的设备一起使用 这个片段(显式地将accelerator_view作为parallel_for_each的第一个参数传递)。

  • 如果可能的话,减少问题的大小,看看你的代码是否运行 TDR,或许其他东西导致TDR(例如驱动程序错误是TDR的常见原因)。一旦您知道您的算法针对较小的问题正确运行,您可以返回搜索为什么TDR会因较大的问题大小而被触发。

  • 完全禁用TDR(see MSDN article on TDR registry keys)并查看是否存在大问题 设置永远完成,如果是这样回到第一点。这将表明您的代码在启用了TDR的accelerator_view上运行。
祝你好运!