Red de conocimiento informático - Material del sitio web - Cómo llamar a CUDA en MFC

Cómo llamar a CUDA en MFC

A veces, necesitamos llamar a CUDA en un proyecto relativamente grande, lo que implica la configuración del entorno de MFC CUDA. Tome la multiplicación de matrices como ejemplo para llamar al programa 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 algunas modificaciones al proyecto predeterminado. Haga clic en "Siguiente", configuramos un proyecto MFC vacío, seleccione "Documento único" y "Estándar MFC":

Haga clic en "Finalizar".

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

(1) Archivo de encabezado

"Agregar" --gt "Nuevo elemento" - - gt; "Visual C" --gt; "Archivo de encabezado (.h)" --gt; "Nombre" --gt; "CUDA_Transfer.h" "Agregar", como se muestra a continuación:

Agregue el siguiente código en CUDA_Transfer.h:

//CUDA_Transfer.h

#include

#include "math.h"

usando el espacio de nombres std;

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

Como se muestra en la siguiente figura:

(2 ) Función

Agrega funciones de manera similar a agregar archivos de encabezado. "Agregar" --gt; "Nuevo elemento" --gt; "Visual C" --gt; "Archivo C (.cpp)" --gt; ; "Agregar", como se muestra a continuación:

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, CPU flotante*)

{

runtest(GPU, CPU

devuelve 0;

Como se muestra en la siguiente figura:

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

3. Cree un filtro para almacenar código cuda, llamado CUDA

"Agregar" --gt "Nuevo filtro", cambie el nombre a CUDA

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

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

Agregar "--gt; "Elemento existente"--gt; "kernel.cu"--gt; "Agregar":

Cambiar el int main( de kernel.cu ) la función se cambia a extern "C" int runtest(float* GPU, float* CPU). Los dos parámetros se utilizan para obtener el tiempo utilizado por los cálculos de GPU y CPU en milisegundos. -click.Project --gt; "Generar personalización":

Marque CUDA 5.0 (.target, .props) en la ventana emergente. Si usa otras versiones de CUDA, verifique la versión correspondiente:

Haga clic en "Aceptar"

6. Modifique la configuración de compilación y enlace de kernel.cu

Haga clic derecho en el archivo kernel.cu en el explorador de soluciones. - gt;"Propiedades", en la ventana emergente--gt;"General"--gt;Seleccione de la lista desplegable "Tipo de elemento"

Después de hacer clic en "Aplicar", aparecerá un Aparecerá en "General". No hay requisitos especiales para la configuración de "CUDA C/C". Haga clic en "Aceptar".

7. es necesario modificar el "Enlazador". --gt; "Entrada" --gt; "Dependencias adicionales" y "Generar eventos" --gt; "Pregenerar eventos" --gt; eso debe configurarse, y lo usamos de manera relativamente simple.

Creamos un nuevo proyecto CUDA vacío, buscamos "Enlazador" --gt; "Entrada" --gt; las propiedades del proyecto de este proyecto CUDA vacío y cambie Copie los elementos contenidos en "Dependencias adicionales" a nuestro proyecto MFC:

De la misma manera, configure el "Evento de compilación" --gt "Pre-; Crear evento" --gt; "command OK":

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

8. Modifique el archivo MFC y complete la llamada.

p>

Necesitamos llamar al programa CUDA en MFC, mostrando el tiempo que le toma a la GPU y la CPU calcular la multiplicación de dos matrices de 1024*1024.

Incluir (incluir) el "CUDA_Transfer". .h" en Matrix Multiplication_KahanMFCView.cpp.

;Agregue el siguiente código en CMatrixMultiplication_KahanMFCView::OnDraw(CDC* pDC):

GPU flotante;

CPU flotante

run_cuda(amp; GPU, amp; CPU);

CString strGPU, strCPU

strGPU.Format(_T("GPU: f; \n"), GPU);

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

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

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

Como se muestra en la figura:

Luego regenere la solución y ejecútela.

El cálculo llevará algún tiempo y deberá esperar. Puede reducir el tamaño de la matriz durante la prueba. Debido a que el programa se agrega a OnDraw, se llamará cada vez que se actualice la ventana (por ejemplo, cuando se cambia el tamaño de la ventana). Dado que el cálculo lleva mucho tiempo, la ventana parecerá que no responde. Simplemente espere hasta que se complete el cálculo.

Los resultados de la ejecución son los siguientes:

Cuando la matriz es relativamente grande, el efecto de aceleración de la GPU es obvio. La GPU solo tarda 620 ms, mientras que la CPU tarda 23438 ms. , que es casi 40 veces más tiempo.