0

2.1 コンピューティング機能を備えた Nvidia カードで Thrust を使用してモンテカルロ シミュレーションを実行しています。一度に device_vector 全体を transform_reduce しようとすると、次のエラーが発生します。ベクトルが非常に大きいため(〜1〜10mb)、デバイスのメモリを使い果たすことは問題ではありません。openmp でコンパイルしてホスト上でのみ実行すると機能するため、コードが正しいことはわかっています。この問題の原因は何ですか?

mccva.exe の 0x776e15de で未処理の例外: Microsoft C++ 例外: メモリ位置 0x0014cb28 での Thrust::system::system_error。

しかし、transform_reduce をチャンクで実行すると、シミュレーションでタイムステップ数をスケーリングするまで問題なく動作し、同じエラーが発生します。

//run the Monte Carlo simulation
zpath * norm_ptr = thrust::raw_pointer_cast(&z[0]);
cout << "initialized raw pointer" << endl;
thrust::device_vector<ctrparty> devctrp = ctrp;
assert(devctrp.size()==ctrp.size());
cout << "Initialized device vector" << endl;
cout << "copied host vec to device vec" << endl;

float cva = 0;
for(unsigned int i=0; i<5; i++)
{
    if(i<4)
        cva += (1-R) * thrust::transform_reduce(devctrp.begin()+i*2000, devctrp.begin() + (i+1)*2000 - 1, calc(norm_ptr, dt, r, sims, N), 0.0f, sum());
    else
        cva += (1-R) * thrust::transform_reduce(devctrp.begin()+i*2000, devctrp.begin() + (i+1)*2000, calc(norm_ptr, dt, r, sims, N), 0.0f, sum());
}  

これを試すとエラーが発生します:

float cva = 0.0f;
try
{
    cva = thrust::transform_reduce(devctrp.begin(), devctrp.end(), calc(norm_ptr, dt, r, sims, N), 0.0f, sum()); //get the simulated CVA
}
catch(thrust::system_error e)
{
    printf(e.what());
}

私は VS2010 を使用していますが、エラーで壊れると、dbgheap.c ファイルで次のようになります。

__finally {
    /* unlock the heap
     */
    _munlock(_HEAP_LOCK);
}
4

1 に答える 1

2

Propertiesプロジェクトの を CUDA カードのコンピューティング機能に調整するのを忘れたときに、推力でそのようなエラーが発生しました

Configuration Properties > CUDA C\C++ > Device > Code Generationcompute_10,sm_10GPU コンピューティング機能に変更する

2.1 コンピューティング機能を備えた Nvidia カードの場合は、compute_20,sm_21

于 2013-05-27T13:58:22.000 に答える