Я пытаюсь изменить простой динамический вектор в CUDA, используя базовую библиотеку CUDA. Но на экране появляется сообщение «launch_closure_by_value», в котором указывается, что ошибка связана с некоторым процессом синхронизации.Как решить библиотеку CUDA Thrust - ошибка синхронизации for_each?
Простая 1D динамическая модификация массива невозможна из-за этой ошибки.
Мой сегмент кода, вызывающий ошибку, выглядит следующим образом.
из .cpp файла, который я называю setIndexedGrid, который определен в System.cu
float* a= (float*)(malloc(8*sizeof(float)));
a[0]= 0; a[1]= 1; a[2]= 2; a[3]= 3; a[4]= 4; a[5]= 5; a[6]= 6; a[7]= 7;
float* b = (float*)(malloc(8*sizeof(float)));
setIndexedGridInfo(a,b);
Код сегмента в System.cu:
void
setIndexedGridInfo(float* a, float*b)
{
thrust::device_ptr<float> d_oldData(a);
thrust::device_ptr<float> d_newData(b);
float c = 0.0;
thrust::for_each(
thrust::make_zip_iterator(thrust::make_tuple(d_oldData,d_newData)),
thrust::make_zip_iterator(thrust::make_tuple(d_oldData+8,d_newData+8)),
grid_functor(c));
}
grid_functor определяется в _kernel.cu
struct grid_functor
{
float a;
__host__ __device__
grid_functor(float grid_Info) : a(grid_Info) {}
template <typename Tuple>
__device__
void operator()(Tuple t)
{
volatile float data = thrust::get<0>(t);
float pos = data + 0.1;
thrust::get<1>(t) = pos;
}
};
Я также получаю их в окне вывода (я использую Visual Studio):
первого шанса исключение в 0x000007fefdc7cacd в Particles.exe: Microsoft C++ исключение: cudaError_enum в ячейке памяти 0x0029eb60 .. Во-первых, вероятность исключения на 0x000007fefdc7cacd в smokeParticles.exe: Microsoft C++ исключение: тяга :: система :: system_error в ячейке памяти 0x0029ecf0 .. необработанное исключением в 0x000007fefdc7cacd в Particles.exe: Microsoft C++ исключение: тяга :: система :: system_error в ячейке памяти 0x0029ecf0 ..
Что вызывает проблема?
Я полностью неправильно понял концепцию тяги. Я думал, что это может также передать принимающие массивы. Я просто пытался увеличить каждый элемент на 0,1. Просто для упражнений. Спасибо за помощь. –
, но это инициализация device_vector не работает. device_vector недостаточно. device_vector требует также typename Alloc: device_vector –
Поверьте мне, это так. Я сделал небольшую синтаксическую ошибку в моих изменениях в вашем вызове 'for_each'. Посмотрите на новую версию. Я теперь проверил с помощью компилятора, и он работает для меня с CUDA 4.1 на компьютере с вычислительным 1.2. – talonmies