First-chance exception c чем его едят?

Добрый день. При выполнении следующего куска кода:

  1.         float *d_AA, *d_x, *d_Ax, *d_AxReal;
  2.         int size_str = (count_str-2);
  3.         int size_Full = temp_0gen*size_str;
  4. (1)     cutilSafeCall( cudaMalloc((void**) &d_AxReal, temp_0gen*sizeof(float)) ); //Реальные суммы
  5.         cutilSafeCall( cudaMalloc((void**) &d_x, size_str*sizeof(float)) ); // Вектор значений
  6.         cutilSafeCall( cudaMalloc((void**) &d_Ax, temp_0gen*sizeof(float)) );// Случайные суммы
  7.         cutilSafeCall( cudaMalloc((void**) &d_AA, size_Full*sizeof(float)) );// Матрица вхождений ФА
  8.         cutilSafeCall( cudaMemcpy(d_AA, SqData, size_Full*sizeof(float), cudaMemcpyHostToDevice) );

в дебаггере проскакивает следующее сообщение
First-chance exception at 0x000007fefd86cacd in 2008.exe: Microsoft C++ exception: cudaError_enum at memory location 0x001be1c0...
Программа отрабатывает без вылетов, но с ошибками в расчетах. При доскональной проверке, выяснилось, что несколько массивов, используемых на ГПУ заполняются как хотят.

При пошаговой отладке, на строке (1) меня отсылает в cuda_runtime.h на

static __inline__ __host__ cudaError_t cudaGetSymbolSize(
size_t *size,
char *symbol
)
{
return cudaGetSymbolSize(size, (const char*)symbol);
}

/**
* \brief \hl Finds the size of the object associated with a CUDA symbol
*
* Returns in \p *size the size of symbol \p symbol. \p symbol can either be a
* variable that resides in global or constant memory space, or it can be a
* character string, naming a variable that resides in global or constant
* memory space. If \p symbol cannot be found, or if \p symbol is not declared
* in global or constant memory space, \p *size is unchanged and the error
* ::cudaErrorInvalidSymbol is returned. If there are multiple global
* variables with the same string name (from separate files) and the lookup
* is done via character string, ::cudaErrorDuplicateVariableName is
* returned.
*
* \param size - Size of object associated with symbol
* \param symbol - Global variable or string symbol to find size of
*
* \return
* ::cudaSuccess,
* ::cudaErrorInvalidSymbol,
* ::cudaErrorDuplicateVariableName
* \notefnerr
*
* \sa \ref ::cudaGetSymbolAddress(void**, const T&) "cudaGetSymbolAddress (C++ API)"
* \ref ::cudaGetSymbolSize(size_t*, const char*) "cudaGetSymbolSize (C API)"
*/

Используемые на девайсе массивы определяются по всем правилам.
Если кто-то сталкивался с подобными ошибками или имеет соображения, что это может быть, заранее благодарен за любую помощь.

Forums: 

First Chance exception

First Chance exception означает, что было исключение и оно было (где-то) обработано.

И, наверное, потом превратилось в код ошибки, который вы проигнорировали....

Спасибо за ответ. Хотелось бы

Спасибо за ответ. Хотелось бы еще идеи услышать из-за чего оно могло быть.

Закомментировав весь код, относящийся к ГПУ, и потом построчно его добавляя нашел причину исключения

  1. cublasSgemv('N', size_str, temp_0gen, 1.0, d_AA, size_str, d_x, 1, 1.0, d_AxReal, 1);

Матрицу d_AA в виде одномерного массива длинной size_str*temp_0gen умножаем на массив d_x длинной size_str. Результат в массив d_AxReal длинной temp_0gen.

Память под них выделяется выше:

  1.         int size_Full = temp_0gen*size_str;
  2.         cutilSafeCall( cudaMalloc((void**) &d_AxReal, temp_0gen*sizeof(float)) ); //Реальные суммы
  3.         cutilSafeCall( cudaMalloc((void**) &d_x, size_str*sizeof(float)) ); // Вектор значений
  4.         cutilSafeCall( cudaMalloc((void**) &d_AA, size_Full*sizeof(float)) );// Матрица вхождений ФА
  5.         cutilSafeCall( cudaMemcpy(d_AA, SqData, size_Full*sizeof(float), cudaMemcpyHostToDevice) );

Может я неправильно использую cublasSgemv, но тогда в каком месте?

Судя по примеру simpleCUBLAS

Судя по примеру simpleCUBLAS (смотрю по CUDA5, но вряд-ли это изменилось), нужно использовать cublasSetVector, а не cudaMemcpy.

Гиг на девайсе и запрашиваю

Гиг на девайсе и запрашиваю размеры 2255 * 786 флотов. Даже с учетом хранения массивов для проверки промежуточных результатов и служебной информации, места должно хватать с избытком.

Ну, на вид все правильно. А

Ну, на вид все правильно.

А матрицы-вектора (A, X, Y - в терминах SGEMV) - инициализированы, там внутри NaN нигде нету?
Вы помните, что Y входит и в результат и в правую часть как beta*Y ?

А - входная матрица,

А - входная матрица, копируемая с хоста. Х - аналогично, только вектор. Y - копирую с хоста забитый нолями массив. Вроде все правильно должно быть.

Ну я могу только

Ну я могу только порекомендовать взять пример simpleCUBLAS и проверить, что он у вас работает (при вашей компиляции, не precompiled)
А дальше - заменить в нем cublasSgemm на cublasSgemv (с соответствующей заменой матриц на векторы) - и тоже проверить.

Других конструктивных идей нет.