Edit 2: включают более полную программуПочему вычислительная норма L2 с cuBLAS приводит к ошибке?
Edit 1: включает полную программу
Я пытаюсь вычислить норму L2 вектора с использованием cuBLAS. Мой код выглядит следующим образом
void GPU_Print_Matrix(real_t *A, int nrows, int ncols) {
real_t *hostA = (real_t*)malloc(nrows*ncols * sizeof(real_t));
CUDA_SAFE_CALL(cudaMemcpy(hostA, A, nrows*ncols * sizeof(real_t), cudaMemcpyDeviceToHost));
cout << "GPU Matrix of Size: " << nrows << "x" << ncols << endl;
for (int i = 0; i < nrows; ++i) {
for (int j = 0; j < ncols; ++j) {
cout << fixed << setprecision(PRINT_PRECISION) << hostA[j*nrows + i] << " ";
}
cout << endl;
}
free(hostA);
cout << endl;
}
void GPU_Random_Vector(thrust::device_vector <real_t> &vec) {
thrust::counting_iterator<unsigned int> index_sequence_begin(rand());
thrust::transform(index_sequence_begin, index_sequence_begin + vec.size(), vec.begin(), RANDOM(-initRange, initRange));
}
int main(int argc, char *argv[]) {
srand(clock());
cout << "# Running NMT" << endl;
//ParseOpts(argc, argv);
cublasHandle_t handle;
CUBLAS_SAFE_CALL(cublasCreate(&handle));
thrust::device_vector <real_t> x(10);
GPU_Random_Vector(x);
GPU_Print_Matrix(thrust::raw_pointer_cast(&x[0]), 10, 1);
real_t nrm = 0;
CUBLAS_SAFE_CALL(cublasXnrm2(handle, 10, thrust::raw_pointer_cast(&x[0]), 1, &nrm));
cout << "nrm2 = " << nrm << endl;
}
Здесь CUBLAS_SAFE_CALL
определяется следующим
#define CUBLAS_SAFE_CALL(call) \
{ \
const cublasStatus_t stat = call; \
if (stat != CUBLAS_STATUS_SUCCESS) { \
cout << "cuBlas Error: " << __FILE__ << ":" << __LINE__ << endl; \
cout << " Code: " << stat << endl; \
exit(1); \
} \
}
GPU_Random_Vector
и GPU_Print_Matrix
были подтверждены на работу раньше. Кроме того, перед вызовом инициализируется cublasHandle[singleGPU]
. Когда я запустил программу, у меня был следующий выход:
// GPU_Print_Matrix
GPU Matrix of Size: 10x1
0.0652332678
0.0747700930
0.0274266358
-0.0885794610
-0.0192640368
-0.0942506194
0.0283640027
-0.0411146656
-0.0460337885
-0.0970785618
cuBlas Error: nmt.cu:2252
Code: 14
Что происходит? И есть ли какая-либо ссылка, как я могу интерпретировать номер ошибки cuBLAS? Благодаря тонну.
Я редактировал вопрос, чтобы включить полную программу. –
@HieuPham: Извините, но это не полная программа. Что такое «GPU_Random_Vector» и «GPU_Print_Matrix»? – talonmies
Этот код по-прежнему неполный и несовместимый. Невозможно предоставить и ответить на ваш вопрос, пока вы не сможете предоставить код, который воспроизводит вашу проблему. – talonmies