我正在尝试使用 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
});
你的代码段看起来不错,问题一定出在其他地方。这里有一些想法:
-
请仔细检查所有parallel_for_each调用并确保它们都accelerator_view与您创建的设备一起使用此代码段(显式传递accelerator_view作为第一个参数传递给parallel_for_each)。
-
如果可能的话,减少问题大小,看看你的代码是否在没有的情况下运行TDR,也许还有其他原因导致了 TDR(例如,驱动程序错误是 TDR 的常见原因)。一旦您知道您的算法可以针对较小的问题正确运行,您就可以返回搜索为什么为较大的问题触发TDR。
-
完全禁用 TDR(请参阅 MSDN 关于 TDR 注册表项的文章),看看您的大问题设置永远完成,如果是这样,请返回第一点。这将指示您的代码在启用了 TDR 的accelerator_view上运行。
祝你好运!