Visual c++ DirectX 11.1尝试创建不触发超时检测恢复的设备

Visual c++ DirectX 11.1尝试创建不触发超时检测恢复的设备,visual-c++,directx,directx-11,c++-amp,Visual C++,Directx,Directx 11,C++ Amp,我尝试使用C++ AMP来在GPU上执行长时间运行的内核。这需要使用DirectX创建一个不会超时的设备。我正在设置标志,但它仍会触发超时检测恢复。我的盒子里有一个专用的Radeon HD 7970,没有插入显示器。我还需要做些什么来防止Windows8在我的内核完成之前取消它 #include <amp.h> #include <amp_math.h> #include <amp_graphics.h> #include <d3d11.h> #i

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

#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
});
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“amp_tinymt_rng.h”
#包括“timer.h”
#包括
#pragma注释(lib,“d3d11”)
#pragma注释(lib,“dxgi”)
//内干管()
unsigned int createDeviceFlags=D3D11\u创建\u设备\u禁用\u GPU\u超时;
ID3D11设备*pDevice=nullptr;
ID3D11DeviceContext*pContext=nullptr;
D3D_功能等级targetFeatureLevel=D3D_功能等级11_1;
D3D_特征级特征级;
自动hr=D3D11CreateDevice(pAdapter,
D3D驱动程序类型未知,
nullptr,
createDeviceFlags,
&目标功能级别,
1.
D3D11_SDK_版本,
&pDevice,
&功能级别,
&pContext);
如果(失败(hr)|
(功能级别!=D3D_功能级别_11_1))
{ 

std::wcerr您的代码片段看起来不错,问题一定在别处。以下是一些想法:

  • 请仔细检查每个调用的所有并行\u,并确保 它们都将accelerator_view与您创建的设备一起使用 此代码段(显式地将accelerator\u视图作为第一个参数传递给parallel\u)

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

  • 完全禁用TDR()并查看是否存在您的大问题 设置是否已完成,如果已完成,请返回到第一点。这将指示您的代码在启用TDR的accelerator_视图上运行


祝你好运!

Simon,作为对第2点的回应,如果我使用较小的实例大小,它不会导致TDR。只有当我将其放大并增加运行长度时,它才会导致TDR。感谢你的帮助。当我回来时,我将发布更多代码,显示加速器视图的创建和每个实例的并行调用,以确保我做得也很正确。我在结尾添加了一些代码,显示了加速器视图的创建,并为每个视图执行并行。不幸的是,我的Nvidia GTX 550 Ti没有DirectX 11.1功能。我需要另一个AMD图形卡。我将在接下来的几天内尝试获取一个,然后再与您联系。我的程序失败自动禁用GPU超时。我必须进入Windows注册表并在那里禁用它。在我这样做之后,一切都运行得很好。出于某种原因,Windows一直触发TDR,即使我添加了禁用GPU超时的标志。