Я провел простой тест texture3D и обнаружил странное поведение при копировании данных на устройство. Функция cudaMemcpy3D возвращает «недопустимый аргумент».
Я обнаружил, что проблема связана с cudaExtent. Согласно справочному руководству 4.0 CUDA Toolkit , параметры cudaExtent следующие:
Итак, я подготовил текстуру следующим образом:
// prepare texture
cudaChannelFormatDesc t_desc = cudaCreateChannelDesc<baseType>();
// CUDA extent parameters w - Width in bytes, h - Height in elements, d - Depth in elements
cudaExtent t_extent = make_cudaExtent(NCOLS*sizeof(baseType), NROWS, DEPTH);
// CUDA arrays are opaque memory layouts optimized for texture fetching
cudaArray *i_ArrayPtr = NULL;
// allocate 3D
status = cudaMalloc3DArray(&i_ArrayPtr, &t_desc, t_extent);
И настроил параметры 3D следующим образом:
// prepare input data
cudaMemcpy3DParms i_3DParms = { 0 };
i_3DParms.srcPtr = make_cudaPitchedPtr( (void*)h_idata, NCOLS*sizeof(baseType), NCOLS, NROWS);
i_3DParms.dstArray = i_ArrayPtr;
i_3DParms.extent = t_extent;
i_3DParms.kind = cudaMemcpyHostToDevice;
И, наконец, скопировал данные в память устройства:
// copy input data from host to device
status = cudaMemcpy3D( &i_3DParms );
Проблема решена, если я только указал количество элемент в измерении x как:
cudaExtent t_extent = make_cudaExtent(NCOLS, NROWS, DEPTH);
который не вызывает ошибок , и тест работает должным образом.
Мне интересно, не пропущу ли я что-то с функцией cudaExtent или чем-то еще. Почему параметр ширины не нужно выражать в байтах ?