Red de conocimiento informático - Material del sitio web - Cómo utilizar cudaMallocPitch y cudaMemcpy2D

Cómo utilizar cudaMallocPitch y cudaMemcpy2D

A veces, necesitamos llamar a CUDA en un proyecto relativamente grande, que implica la configuración del entorno de MFC + CUDA. Tomando la multiplicación de matrices como ejemplo, presentaremos la llamada a programas CUDA en MFC. Nos referimos al método de Luo Zhendong iylzd@163.com (Escuela de Ciencias de la Computación, Universidad Nacional de Tecnología de Defensa).

Entorno: Windows 7 SP1

Microsoft Visual Studio 2010

CUDA 5.0

Pasos:

1. Primero, cree un proyecto vacío de "Aplicación FCM" llamado Matrix Multiplication_KahanMFC:

Haga clic en "Aceptar" y aparecerá la siguiente ventana

Necesitamos realizar algunos cambios en el proyecto predeterminado. ¡Haga clic en "Siguiente paso"! "Configuramos un proyecto MFC vacío, seleccionamos "Documento único" y "Estándar MFC":

Haga clic en "Finalizar".

2. Cree la función de interfaz de llamada CUDA y su encabezado archivo

(1) Archivo de encabezado

"Agregar" --> "Nuevo elemento" --> "Visual C++" --> "Archivo de encabezado" --> ". Encabezado file (.h)" --> "Nombre" --> "CUDA_Transfer.h " --> "Agregar" lo siguiente:

Agregue el siguiente código en CUDA_Transfer.h:

//CUDA_Transfer.h

#include

# incluye "math.h"

usando el espacio de nombres std;

int run_cuda (GPU flotante*, CPU flotante*);

Como se muestra a continuación:

(2) Función

Agregue funciones de manera similar a agregar archivos de encabezado. Agregar" --> "Nuevo proyecto" --> "Visual C++" --> "Visual C++" --> "Visual C++" --> "Visual C++cpp)" --> "Archivo C++ (.cpp) )" --> "Nombre" --> "CUDA_Transfer.cpp" --> "Agregar" lo siguiente:

Agregue el siguiente código en CUDA_Transfer.cpp:

// CUDA_Transfer .cpp

#include "CUDA_Transfer.h"

#include " stdafx.h"

extern "C" int runtest(float* GPU, float * CPU);

int run_cuda(float* GPU, float* CPU)

{

runtest(GPU,CPU);

return 0;

}

Como se muestra en la siguiente figura:

Cabe señalar que el archivo .cu no se puede incluir en el archivo MFC, de lo contrario, se informará como un error. cu, se informará un error, por lo que usamos "C" externa para implementar la llamada a la función.

3. Cree un filtro que guarde el código cuda y asígnele el nombre CUDA

"Agregar" --> "Nuevo filtro" y cámbiele el nombre a CUDA

4. Cree un archivo de código fuente CUDA kernel.cu en el filtro CUDA.

Copiamos directamente el programa kernel.cu ya escrito para la multiplicación de matrices al directorio del proyecto y lo agregamos al filtro CUDA.

Agregar"--> "Proyecto existente"--> "kernel.cu"--> "Agregar":

Cambiar la función int main() de kernel.cu para extern "C" int runtest(float*GPU, float*CPU), los dos parámetros se utilizan para obtener el tiempo de milisegundos utilizado para los cálculos de GPU y CPU

5. Build custom":

Marque CUDA 5.0 (.target,.props) en la ventana emergente. Si está utilizando otra versión de CUDA, verifique la versión correspondiente:

Haga clic en Aceptar

6. Modificar la configuración del enlace de compilación de kernel.cu

Haga clic con el botón derecho en el archivo kernel.cu en el explorador de soluciones --> "Propiedades" en la ventana emergente. > "General" --> Seleccione de la lista desplegable "Tipo de proyecto"

Haga clic en "Aplicar" y aparecerá un "General" debajo. Después de hacer clic en "Aplicar", en "General" A. Aparecerá la configuración "CUDA C/C++". No hay ninguna necesidad especial y no se requiere ninguna modificación. Haga clic en "Aceptar".

7. para modificar "enlazador". --> "entrada"--> "dependencias adicionales" y "Generar eventos"--> "Pregenerar eventos"--> "Línea de comando" tienen más parámetros para configurar, por lo que usaremos el método más simple.

Creamos un nuevo proyecto CUDA vacío, buscamos "Enlazador"-->"Entrada"-->"Dependencias adicionales" en las propiedades del proyecto de este proyecto CUDA vacío y cambiamos ". Adjuntar Copie los proyectos contenidos en "Dependencias" a nuestro proyecto MFC:

Siga el mismo método, configure "Eventos de compilación" --> "Eventos previos a la compilación" en "Eventos previos a la compilación" y configure " "Evento previo a la compilación" está configurado en "Evento previo a la compilación". "Evento previo a la compilación" --> "Línea de comando":

Una vez completada la configuración, haga clic en "Aceptar".

8. Modifique el archivo MFC para completar la llamada.

Necesitamos llamar al programa CUDA en MFC para mostrar el tiempo que tardan la GPU y la CPU en calcular la multiplicación de dos. 1024*1024 matrices.

En multiplicación de matrices_KahanMFCView.Format(_T("GPU:%f \n"),GPU);

strCPU.Format(_T("CPU:% f \n"),CPU);

pDC->TextOut(0,0,strGPU);

pDC->TextOut(0,30,strCPU);

Como se muestra en la figura:

Luego reconstruya la solución y ejecútela.

El cálculo lleva algo de tiempo y requiere espera; puede cambiar el tamaño de la matriz a menor durante la prueba. Debido a que esta rutina se agrega a OnDraw, se llama cada vez que se actualiza la ventana (por ejemplo, cuando se cambia el tamaño de la ventana). Dado que el cálculo lleva mucho tiempo, la ventana parecerá no responder; simplemente espere a que se complete el cálculo.

Los resultados de la ejecución son los siguientes:

Cuando la matriz es grande, el efecto de aceleración de la GPU es muy obvio. La GPU solo tarda 620 ms, mientras que la CPU tarda 23.438. ms. Hay una diferencia entre los dos. Casi 40 veces.