CUDA: использование cudaMemcpyHostToDevice со структурами - PullRequest
2 голосов
/ 27 февраля 2011

у меня есть:

typedef struct
{
    float x;
    float y;
    float z;
}vec3;

lineCuda.cu

extern "C" void cudaTranslate(vec3 *grid, float xrot,vec3 center, int multi)
{
    vec3 *dev_grid[2000];
    cudaMalloc( (void**)&dev_grid, sizeof(vec3)*2000 ) ;
    cudaMemcpy(dev_grid, grid, sizeof(vec3)*2000, cudaMemcpyHostToDevice); //error

Компилируется нормально, но время выполнения показывает: исключение первого шанса в 0x75c6b727 в cube.exe: исключение Microsoft C ++: cudaError_enum в расположении памяти 0x002cbef8 ..

Ответы [ 2 ]

3 голосов
/ 27 февраля 2011
vec3 *dev_grid[2000];

должно быть

vec3 dev_grid[2000];

хорошо, я вижу, сделай это

vec3 *dev_grid = 0;

http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/online/group_CUDART_ERROR.html

const char * cudaGetErrorString (ошибка cudaError_t) Возвращает строку сообщения из кода ошибки. cudaError_t cudaGetLastError (void) Возвращает последнюю ошибку из вызова во время выполнения.

0 голосов
/ 28 февраля 2011

CUDA использует указатель хоста (на ЦП) для указания на блок памяти устройства (на графическом процессоре).

Для этого он изменил указатель на вызов cudaMalloc. Позже память на GPU освобождается с помощью соответствующего вызова cudaFree.

Когда вы выделяете dev_grid, вы выделяете его с помощью процессора. Модификация указателя не позволила бы ЦПУ освободить память позже, используя free, delete или другой подобный механизм. Таким образом, CUDA, скорее всего, имеет встроенную проверку, чтобы предотвратить это, заставляя cudaMalloc работать только с текущими нулевыми указателями.

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