l’utilizzo gratuito per l’host determina un errore di segmentazione

Ho un file cu con il kernel come:

__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); } 

e un file cpp dal quale sto chiamando il 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); 

Ora, usando il

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

in cu file risultati in

Difetto di segmentazione

Se uso cudaFree o cudaFreeHost (che non sono corretti perché sto allocando con alloc) mostra “pointer device non valido” o “argomento non valido”.

Se non userò affatto affatto, il programma funziona correttamente.

Perché è questo e qual è il processo appropriato per quanto riguarda queste allocazioni di memoria?

Stai chiamando free() due volte sugli stessi puntatori, non è valido. La gestione della memoria in questo codice è strana e confusa.

Suppongo che abbia più senso rimuovere le chiamate free() all’interno della funzione kernel_wrapper() ; poiché è impostato per restituire i puntatori al chiamante, non ha senso free() la memoria nella funzione.