использование бесплатных для хоста результатов в результате сегментации

У меня есть файл cu с kernelм вроде:

__global__ void kernel(float* A,float *B, curandState* globalState,int Asize,int Bsize) { .... } void kernel_wrapper(float** A_host,float** B_host, int Asize ,int Bsize) { ... //allocate host memory *A_host=(float*)malloc(Asize*sizeof(float)); *B_host=(float*)malloc(Bsize*sizeof(float)); //allocate device memory float* A_dev,*B_dev; gpuErrchk(cudaMalloc((void**) &A_dev,Asize* sizeof(float))); gpuErrchk(cudaMalloc((void**) &B_dev,Bsize* sizeof(float))); // copy arrays from host to device gpuErrchk(cudaMemcpy(A_dev, *A_host,Asize* sizeof(float), cudaMemcpyHostToDevice)); gpuErrchk(cudaMemcpy(B_dev, *B_host,Bsize* sizeof(float), cudaMemcpyHostToDevice)); .... kernel<<>>(A_dev,B_dev, devStates,Asize,Bsize); // copy result from device to host gpuErrchk(cudaMemcpy(*A_host, A_dev,Asize* sizeof(float), cudaMemcpyDeviceToHost)); gpuErrchk(cudaMemcpy(*B_host, B_dev,Bsize* sizeof(float), cudaMemcpyDeviceToHost)); //clean up device memory gpuErrchk(cudaFree(A_dev)); gpuErrchk(cudaFree(B_dev)); gpuErrchk(cudaFree(devStates)); //clean up host memory free(*A_host); free(*B_host); } 

и файл cpp, из которого я вызываю kernel:

 ... extern void kernel_wrapper(float** A,float** B, int Asize ,int Bsize); ... int main() { ... float* A; float* B; ... kernel_wrapper(&A,&B,Asize ,Bsize); ... free(A); free(B); 

Теперь, используя

 free(*A_host); free(*B_host); 

в файле cu

Ошибка сегментации

Если я использую cudaFree или cudaFreeHost (что неправильно, потому что я выделяю с помощью alloc), он показывает «неверный указатель устройства» или «недопустимый аргумент».

Если я вообще не буду использовать бесплатный, программа будет работать нормально.

Почему это и каков надлежащий процесс в отношении этих распределений памяти?

Вы вызываете free() дважды по тем же указателям, это неверно. Управление памятью в этом коде странно и запутанно.

Я думаю, что имеет смысл удалить вызовы free() внутри функции kernel_wrapper() ; поскольку он настроен для возврата указателей на вызывающий, нет смысла free() память в функции.