Я запускаю симуляцию Монте-Карло с использованием Thrust на карте Nvidia с возможностью вычислений 2.1. Если я пытаюсь преобразовать весь device_vector сразу, я получаю следующую ошибку. Это не вопрос использования памяти на устройстве, потому что векторы такие большие (~ 1-10Мб). Я знаю, что мой код прав, потому что он работает, если я компилирую с openmp и запускаю только на хосте. Что может быть причиной этой проблемы?
Необработанное исключение в 0x776e15de в mccva.exe: исключение Microsoft C ++: thrust :: system :: system_error в ячейке памяти 0x0014cb28.
Но если я выполняю 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);
}
У меня была такая ошибка с тягой, когда я забыл отрегулировать Properties
проекта к моей вычислительной способности карты CUDA
Configuration Properties > CUDA C\C++ > Device > Code Generation
менять compute_10,sm_10
к вашей вычислительной способности GPU
Для карты Nvidia с вычислительной способностью 2.1 это будет compute_20,sm_21
Других решений пока нет …