samples - Usando cudaMalloc para asignar una matriz
cuda tutorial (2)
¿Cuál es tu objetivo final de este código? Como se mencionó anteriormente, probablemente sea mejor para usted aplanar pa en una matriz unidimensional para usar en la GPU. Algo como:
float *pa;
cudaMalloc((void**)&pa, N*N*sizeof(float));
Desafortunadamente, tendrías que ajustar A [i] para hacer tu copia de memoria de esta manera.
Estoy usando cudaMalloc y cudaMemcpy para asignar una matriz y copiar en ella matrices de vectores, como esta:
float **pa;
cudaMalloc((void***)&pa, N*sizeof(float*)); //this seems to be ok
for(i=0; i<N; i++) {
cudaMalloc((void**) &(pa[i]), N*sizeof(float)); //this gives seg fault
cudaMemcpy (pa[i], A[i], N*sizeof(float), cudaMemcpyHostToDevice); // also i am not sure about this
}
¿Qué está mal con mis instrucciones? Gracias por adelantado
PS A [i] es un vector
Ahora estoy tratando de copiar una matriz desde el dispositivo a una matriz desde el host:
Supongamos que tengo ** pc en el dispositivo, y ** pgpu está en el host:
cudaMemcpy (pgpu, pc, N*sizeof(float*), cudaMemcpyDeviceToHost);
for (i=0; i<N; i++)
cudaMemcpy(pgpu[i], pc[i], N*sizeof(float), cudaMemcpyDeviceToHost);
= está mal ...
pa
está en la memoria del dispositivo, entonces &(pa[i])
no hace lo que esperas. Esto funcionará
float **pa;
float **pah = (float **)malloc(pah, N * sizeof(float *));
cudaMalloc((void***)&pa, N*sizeof(float*));
for(i=0; i<N; i++) {
cudaMalloc((void**) &(pah[i]), N*sizeof(float));
cudaMemcpy (pah[i], A[i], N*sizeof(float), cudaMemcpyHostToDevice);
}
cudaMemcpy (pa, pah, N*sizeof(float *), cudaMemcpyHostToDevice);
es decir. construye la matriz de punteros en la memoria del host y luego cópiala en el dispositivo. No estoy seguro de lo que estás esperando leer de A
, pero sospecho que el cudaMemcpy
interno probablemente no está haciendo lo que quieres como está escrito.
Tenga en cuenta que, desde el punto de vista del rendimiento, las matrices de punteros no son una buena idea en la GPU.