Неверный аргумент в cudaMemcpy3D, использующий ширину в байтах? - PullRequest
5 голосов
/ 22 февраля 2012

Я сделал простой тест texture3D и обнаружил странное поведение при копировании данных на устройство. Функция cudaMemcpy3D возвращает «неверный аргумент».

Я обнаружил, что проблема связана с cudaExtent. В соответствии со справочным руководством CUDA Toolkit 4.0 параметры cudaExtent следующие:

  • w - Ширина в байтах
  • ч - высота в элементах
  • d - Глубина в элементах

Итак, я подготовил текстуру следующим образом:

// 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 или что-то еще. Почему параметр width не требуется выражать в байтах ?

1 Ответ

6 голосов
/ 22 февраля 2012

Для массивов CUDA экстент указывается с шириной, указанной в элементах массива. Для выделения линейной памяти экстент указывается с шириной, указанной в байтах. Поскольку вы выделяете массив с cudaMalloc3DArray, используйте ширину в элементах. Если вы используете cudaMalloc3D, экстент будет иметь ширину в байтах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...