2012-06-26 4 views
1

У меня возникла проблема со следующим кодом: при выполнении вызова cublasSrotg он выдает исключение: «Адрес записи нарушения доступа 0x05200600», который является адресом указателя «dA». При запуске отладчика он пропускает вызов cudaMalloc, но я не могу понять, что я делаю неправильно.Нарушение прав доступа при вызове функции cublas

cublasHandle_t handle; 
cublasCreate(&handle); 
float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f }; 
int sizef = sizeof(float); 
float* dA; 
cudaMalloc((void**)&dA, SIZE * sizef); 
cublasSetVector(SIZE, sizef, hA, 1, dA, 1); 
float s, c; 
cublasSrotg(handle, dA, dA + N, &c, &s); 
cublasSrot(handle, N, dA, 1, dA + N, 1, &c, &s); 
cublasGetVector(SIZE, sizef, dA, 1, hA, 1); 
... 
+0

Я бы предложил добавить проверку ошибок cuda. Вы можете найти дополнительную информацию о проверке ошибок cuda в google. Это поможет вам понять, где ваш код поступил не так и как была ошибка cuda. – user1477622

+0

cudaError error = cudaMalloc ((void **) & dA, SIZE * sizef); Посмотрите, что он возвращает. Если в cudaMalloc нет ошибки, проверьте, даете ли вы правильные аргументы функции или нет. – jwdmsd

ответ

1

Из следующей строки кода я понял, что SIZE равно 4.

float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f }; 

Но здесь, вы делаете две странные вещи:

cublasSrotg(handle, dA, dA + N, &c, &s); 
  1. Вы смешиваете хозяина и устройства параметров в одной и той же функции cublas (я не знаю, если это законно или нет). dA - указатель устройства, а s и c - переменные хоста.

  2. Вы передаете dA и dA + N. Если N меньше, чем 4, вы будете индексировать границы, так что это может быть вашей проблемой. Также обратите внимание, что первые два входа в cublasSrotg являются переменными ввода/вывода - их начальное значение используется, но затем перезаписывается.

Так как они будут перезаписаны, это странно, что вы можете передать те же указатели на cublasSrot ...

Смотрите CUBLAS Documentation для получения полной информации.

Edit:

OP показывает, что проблема смешивания указателей устройств и узла, а также не вызывая cudaMalloc выделить значения c и s на устройстве.

+0

Я попытался вызвать cublasSetPointerMode (дескриптор, CUBLAS_POINTER_MODE_DEVICE), прежде чем вызывать rotg (и передавать только указатели на устройство) и исправил исключение нарушения доступа, но теперь он не работает в cublasGetVector с CUBLAS_STATUS_MAPPING_ERROR. Чтобы усугубить ситуацию, я проверил cudaGetLastError и вернул «неизвестную ошибку» – santisan

+0

Каково значение 'N'? – harrism

+0

Значение N равно 2 – santisan