Aprendizaje de programación cuda: ¡el primer programa cuda! Productos secos a (1)

Prefacio:

Recientemente, cuando estaba haciendo reconstrucción 3D, especialmente el trabajo de síntesis multivista en Nerf, me di cuenta de que el cálculo de programación de cuda puede mejorar mucho el cálculo de renderizado. Los ejemplos más obvios son artículos como Instant-ngp y Plenoxels, así que Aprenderé sobre Cuda más tarde Al mismo tiempo, se abrió este nuevo agujero.
Debido a que el autor también es un novato en cuda, si tiene alguna pregunta, puede señalarla en el área de comentarios, ¡y aprender y progresar juntos!

Información de inicio oficial de Nvidia Cuda

Entorno operativo:

Windows10, Visual Studio2019, tarjeta gráfica 3050Ti
(puedes configurar el entorno según tu propio portátil, o si no tienes GPU, también puedes alquilar un servidor en la nube para aprender)

(1) programa cuda

Paso de análisis:
1: Llame al dispositivo de la tarjeta gráfica
2: Asigne espacio de memoria de video, es decir, espacio de GPU
3: Asigne espacio de CPU
4: Copie los datos en la CPU al espacio de GPU asignado
5: Realice cálculos en la GPU y ejecute el función kernel kernel
6: copia el resultado del cálculo de la GPU al espacio de la CPU
7: genera los datos copiados en la CPU
8: completa el trabajo, libera la CPU y el espacio de la GPU

#include<stdint.h>
#include<cuda.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

//定义核函数, 在host调用, device上计算, 该函数作用为把空间幅值为1
__global__ void kernel(float* a)
{
    
    
	a[threadIdx.x] = 1;

}
int main(int argc, char** argv)
{
    
    
	// 设置使用的显卡设备  cpu用 host表示  gpu用device表示
	cudaSetDevice(0);
	//分配显存空间  dx  表示 device 上的空间x
	float* dx;
	cudaMalloc((void**)&dx, 16 * sizeof(float));
	//分配cpu内存空间
	float hx[16] = {
    
     0 };
	//把cpu上的数据拷贝到gpu device 上
	cudaMemcpy(dx, hx, 16 * sizeof(float), cudaMemcpyHostToDevice);
	kernel << <1, 16 >> > (dx);
	//把gpu上的数据,计算结果,拷贝到cpu host 上
	cudaMemcpy(hx, dx, 16 * sizeof(float), cudaMemcpyDeviceToHost);
	for (int i = 0; i < 16; i++)
	{
    
    
		printf("%f \n", hx[i]);
	}
	//释放资源 分别释放 显存和内存空间
	cudaFree(dx);
	free(hx);
//	cudaDeviceReset();
	return 0;
}


























Supongo que te gusta

Origin blog.csdn.net/qq_40514113/article/details/130752967
Recomendado
Clasificación