Espacios de direcciones separados
Por qué un puntero del host no es válido en el dispositivo.
Espacios de direcciones separados es una lección gratuita de CUDA Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de CUDA Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de CUDA Academy incluye 4 lecciones en total.
Dos memorias independientes
La CPU y la GPU tienen su propia RAM. No comparten un mismo espacio de direcciones, y ese único hecho determina gran parte de CUDA. 🧠
Qué significa una dirección
Un puntero es simplemente un número que identifica una posición de memoria. Esa posición solo tiene sentido en el address space donde se creó.
Los punteros del host son locales
Un puntero obtenido con malloc identifica host memory. La GPU no tiene esa posición, por lo que pasárselo a un kernel apunta a un lugar no válido.
int* h = (int*)malloc(n * sizeof(int));Los punteros del dispositivo también son locales
Un puntero obtenido con cudaMalloc identifica device memory. La CPU no puede leerlo directamente; desreferenciarlo en el host provoca un fallo.
int* d;
cudaMalloc(&d, n * sizeof(int));El error clásico
Pasar un host pointer a un kernel compila correctamente, pero falla en tiempo de ejecución. El número es válido; la memoria que identifica no está en la GPU.
Por qué compila de todos modos
Para C++, ambos punteros parecen tener el mismo tipo, por lo que el compilador no avisa. El mismatch solo causa problemas cuando la GPU accede a la dirección.
Tender un puente con cudaMemcpy
Para mover datos entre ambos espacios debe copiarlos explícitamente con cudaMemcpy. No existe intercambio automático entre ellos.
cudaMemcpy(d, h, bytes, cudaMemcpyHostToDevice);Una convención de nombres ayuda
Muchos programadores anteponen h_ a los punteros del host y d_ a los punteros del dispositivo. Es una costumbre que evita confusiones dolorosas.
float *h_a, *d_a;Los kernels ven el espacio del dispositivo
Dentro de un kernel, todo puntero que desreferencie debe estar en device memory. Ese es el único espacio al que pueden acceder los subprocesos de la GPU.
Pista sobre la memoria unificada
Más adelante conocerá la unified memory, que permite usar un mismo puntero válido en ambos lados. Por ahora, mantenga estrictamente separados los punteros del host y del dispositivo.
El modelo mental
Imagine dos habitaciones sin estantes compartidos. Para usar datos de la otra habitación debe carry a copy, nunca limitarse a apuntar hacia el otro lado.
Comprobación rápida
Confirmemos que comprende los espacios de direcciones independientes.
Repaso
Ha aprendido que el host y el dispositivo viven en separate address spaces, que los punteros no son intercambiables y que cudaMemcpy permite transferir datos entre ambos. ✅
Aprende C++ con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 30
- Lecciones
- 120
Preguntas frecuentes
¿La lección «Espacios de direcciones separados» es gratis?
Sí — el texto completo de «Espacios de direcciones separados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de CUDA Academy, actualiza a CoddyKit PRO. El curso de CUDA Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Espacios de direcciones separados»?
Por qué un puntero del host no es válido en el dispositivo. Practicas CUDA Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar CUDA Academy?
No se requiere experiencia previa. CUDA Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Espacios de direcciones separados»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de CUDA Academy?
Sí. Cada lección de CUDA Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El calificador de función __global__
- Funciones __device__ y __host__
- Espacios de direcciones separados
- El ciclo de vida de un programa CUDA