cudaMemcpy2D para copias de memoria compartida

Tengo algo de memoria que se ha asignado en un dispositivo que es solo un solo malloc de H * W * sizeof (float) en tamaño.

Esto es para representar una matriz H * W.

Tengo un código donde necesito intercambiar los cuadrantes de la matriz. ¿Puedo usar cudaMemcpy2D para lograr esto? ¿Necesitaría especificar el spitch y dpitch para que sean W * sizeof (float) y solo usar punteros a cada cuadrante de la matriz para lograr esto?

Además, cuando estos cudaMemcpy hablan de que las áreas de memoria no se superponen, ¿eso significa que src y dst no pueden superponerse en absoluto? Por ejemplo, si tuviera una matriz de 10 bytes de ancho que quisiera cambiar a la izquierda una vez, ¿fallará?

Muchas Gracias

preguntado el 16 de mayo de 11 a las 16:05

2 Respuestas

Puede usar cudaMemcpy2D para moverse por sub-bloques que son parte de asignaciones de memoria lineal de mayor tono. No hay ningún problema en hacer eso. El requisito de no superposición no es negociable y fallará si lo intenta. El origen y el destino pueden provenir de la misma asignación, pero los rangos de direcciones del origen y el destino no pueden superponerse. Si necesita hacer alguna copia "in-situ" donde hay superposición, es mejor que escriba un núcleo para hacerlo (vea el ejemplo de transposición de matriz en el SDK como una forma sólida de hacer ese tipo de cosas).

contestado el 16 de mayo de 11 a las 21:05

Sugiero escribir un núcleo simple para hacer esta manipulación de la matriz. Creo que sería más fácil de escribir que usar cudaMemcpy (2D) y casi definitivamente más rápido asumiendo que lo escribe para obtener una buena coherencia de memoria.

Probablemente sea más fácil hacer una transformación fuera de lugar (es decir, diferentes matrices de entrada y salida) para evitar golpear la matriz de entrada. Cada hilo simplemente leería desde su desplazamiento de entrada y escribiría en el desplazamiento transformado.

Sería similar a una transposición de matriz. Hay un ejemplo de transposición de matriz en el SDK de CUDA.

contestado el 17 de mayo de 11 a las 07:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.