CUDA C双变量加法

该文介绍了如何使用CUDA进行设备内存管理和内核函数参数传递。示例程序展示了如何在GPU上执行双变量加法,先通过cudaMalloc在设备上分配内存,然后将主机变量复制到设备,调用__global__内核函数进行计算,最后将结果从设备内存复制回主机并打印。程序还演示了如何通过指针引用传递参数,实现对设备内存中变量的操作。
部署运行你感兴趣的模型镜像
#include <iostream>
#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>

//Definition of kernel function to add two variables
__global__ void gpuAdd(int d_a, int d_b, int *d_c)
{
	*d_c = d_a + d_b;
}

//main function
int main() 
{
	//Defining host variable to store answer
	int h_c;
	//Defining device pointer
	int *d_c;
	//Allocating memory for device pointer
	cudaMalloc((void**)&d_c, sizeof(int));
	//Kernel call by passing 1 and 4 as inputs and storing answer in d_c
	//<< <1,1> >> means 1 block is executed with 1 thread per block
	gpuAdd << <1, 1 >> > (1, 4, d_c);
	//Copy result from device memory to host memory
	cudaMemcpy(&h_c, d_c, sizeof(int), cudaMemcpyDeviceToHost);
	printf("1 + 4 = %d\n", h_c);
	//Free up memory
	cudaFree(d_c);
	return 0;
}

在 main 函数中,前两行定义主机和设备的变量。第三行使用cudaMalloc 函数在设备上分配d_c变量的内存。cudaMalloc 函数类似于C中的malloc 函数。在 main 函数中调用 gpuAdd,其中1和4 是两个输人变量,d_c是一个作为输出指针变量的设备显存指针。如果 gpuAdd 的结果需要在主机上使用,那么它必须从设备的内存复制到主机的内存中,这是由 cudaMemcpy函数完成的。然后,使用 printf 函数打印这个结果。倒数第二行使用cudaFree 函数释放设备上使用的内存。从程序中释放设备上使用的所有内存是非常重要的,否则,你可能在某个时候耗尽内存。
双变量加法程序有两个函数:main 和gpuAdd。如你所见,gpuAdd 是通过使用__global__关键字定义的,因此它用于在设备上执行,而 main 函数将在主机上执行。这个程序将设备上的两个变量相加,并在命令行上打印输出。

现在我们将看到如何通过引用传递参数来编写相同的程序。为此,我们必须首先修改内核函数来添加两个变量。不是使用整数变量d_a和d_b作为内核的输入,而是将指向设备d_a和d_b上这些变量的指针作为输入。相加后的答案会存储在第三个整数指针d_c所指向的内存位置。作为这个设备函数引用传递的指针应该用cudaMalloc函数分配内存。

#include <iostream>
#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>

//Kernel function to add two variables, parameters are passed by reference
__global__ void gpuAdd(int *d_a, int *d_b, int *d_c) 
{
	*d_c = *d_a + *d_b;
}

int main() 
{
	//Defining host variables
	int h_a,h_b, h_c;
	//Defining Device Pointers
	int *d_a,*d_b,*d_c;
	//Initializing host variables
	h_a = 1;
	h_b = 4;
	//Allocating memory for Device Pointers
	cudaMalloc((void**)&d_a, sizeof(int));
	cudaMalloc((void**)&d_b, sizeof(int));
	cudaMalloc((void**)&d_c, sizeof(int));
	//Coping value of host variables in device memory
	cudaMemcpy(d_a, &h_a, sizeof(int), cudaMemcpyHostToDevice);
	cudaMemcpy(d_b, &h_b, sizeof(int), cudaMemcpyHostToDevice);
	//Calling kernel with one thread and one block with parameters passed by reference
	gpuAdd << <1, 1 >> > (d_a, d_b, d_c);
	//Coping result from device memory to host
	cudaMemcpy(&h_c, d_c, sizeof(int), cudaMemcpyDeviceToHost);
	printf("Passing Parameter by Reference Output: %d + %d = %d\n", h_a, h_b, h_c);
	//Free up memory 
	cudaFree(d_a);
	cudaFree(d_b);
	cudaFree(d_c);
	return 0;
}

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给算法爸爸上香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值