2

C ++ AMPを使用して、GPUで長時間実行されているカーネルを実行しようとしています。これには、DirectXを使用して、タイムアウトしないデバイスを作成する必要があります。フラグを設定していますが、それでもタイムアウト検出リカバリがトリガーされています。モニターを接続せずに、専用のRadeonHD7970をボックスに入れています。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
});
4

1 に答える 1

2

スニペットは良さそうですが、問題は別の場所にあるはずです。ここにいくつかのアイデアがあります:

  • すべての parallel_for_each 呼び出しを再確認し、すべてがこのスニペットで作成したデバイスでaccelerator_view を使用していることを確認してください (accelerator_view を最初の引数として parallel_for_each に明示的に渡します)。

  • 可能であれば、問題のサイズを縮小し、コードが TDR なしで実行されるかどうかを確認します。おそらく、他の何かが TDR を引き起こしている可能性があります (たとえば、ドライバーのバグが TDR の一般的な原因です)。アルゴリズムが小さな問題で正しく実行されることがわかったら、大きな問題サイズで TDR がトリガーされる理由の検索に戻ることができます。

  • TDR を完全に無効にし ( TDR レジストリ キーに関する MSDN の記事を参照)、大きな問題セットが完了するかどうかを確認します。完了する場合は、最初のポイントに戻ります。これは、TDR が有効になっているアクセラレーター ビューでコードが実行されることを示します。

幸運を!

于 2012-12-10T17:20:25.543 に答える