& Quot; cudaErrorUnknown & Quot; в вызове функции cudaMemcpy

Я использую функцию, чтобы вычислить векторную точку из трех векторов, и использую уменьшение, чтобы сделать это быстрее.
Тем не менее, я всегда получаю ошибку, как это:

CUDA error at kernel.cu:120 code=30(cudaErrorUnknown) "cudaMemcpy(partia
l_c, dev_partial_c,sizeofblock,cudaMemcpyDeviceToHost )"

Я не могу понять, почему, потому что код кажется нормальным. И функция allocate не возвращала ошибку. Есть ли какие-либо возможные решения?
Спасибо большое.

double vector_dot(double* d_A,double* d_B,double *d_C,int numElements)
{
int size = sizeof(double) * numElements;
int c_size = sizeof(char) * numElements;
double *d_D=NULL;
checkCudaErrors(cudaMalloc((void**)&d_D,size));
// Launch the Vector Add CUDA Kernel
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorMPL<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_D, numElements);
double *partial_c;
double*dev_partial_c;
int sizeofblock=blocksPerGrid*sizeof(double);
partial_c = (double*)malloc(sizeofblock);
checkCudaErrors( cudaMalloc( (void**)&dev_partial_c,sizeofblock )) ;
vector_dot_h<<<blocksPerGrid, threadsPerBlock>>>(d_D, d_C, dev_partial_c, numElements);

double sum = 0;
checkCudaErrors(cudaMemcpy(partial_c,dev_partial_c,sizeofblock,cudaMemcpyDeviceToHost));

for (int i=0; i<blocksPerGrid; i++) {
sum += partial_c[i];
}

checkCudaErrors(cudaFree(d_D));
checkCudaErrors(cudaFree(dev_partial_c));
free(partial_c);
// Reset the device and exit
checkCudaErrors(cudaDeviceReset());
return sum;
}

Если я удаляю это, я получу неизвестную ошибку в вызове cudafree. Кажется, что все вызовы API cuda не могут быть завершены. Мне интересно, почему?
Что такое ошибка CUDA неизвестна? В чем причина?

1

Решение

документация для обоих cudaMemcpy а также cudaFree содержит следующее примечание:

Обратите внимание, что эта функция также может возвращать коды ошибок из предыдущих,
асинхронные запуски.

то есть. ошибка не происходит ни в одном cudaMemcpy или же cudaFreeскорее это происходит во время предыдущего запуска или запуска ядра. Если вы будете следовать этот совет и измените свой код так:

vectorMPL<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_D, numElements);
checkCudaErrors(cudaPeekAtLastError());
checkCudaErrors(cudaDeviceSynchronize());

Вы должны обнаружить, что ошибка сообщается cudaDeviceSynchronize() вызов, указывающий, что ошибка произошла во время выполнения ядра. Основной причиной ошибки, скорее всего, будет выход за пределы памяти в пределах vector_dot_h, но так как вы не предоставили ни код, ни параметры выполнения для рассматриваемого вызова ядра, невозможно поставить вам более точный диагноз. Инструментарий CUDA поставляется с утилитой под названием cuda-memcheck который вы можете использовать для получения дополнительной информации о недопустимых шаблонах доступа к памяти в работающем ядре. Я рекомендую вам попробовать использовать его в этом коде.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]