cuda编程学习2——add

本文详细介绍了CUDA中cudaMalloc()分配的指针使用限制,并通过一个简单的加法示例程序展示了如何在CUDA中正确地使用设备指针进行内存操作。
部署运行你感兴趣的模型镜像

cudaMalloc()分配的指针有使用限制,设备指针的使用限制总结如下:

1.可以将其传递给在设备上执行的函数

2.可以在设备代码中使用其进行内存的读写操作

3.可以将其传递给在主机上执行的函数

4.不能在主机代码中使用其进行内存的读写操作

总的来说就是主机指针只能访问主机代码中的内存,设备指针只能访问设备代码中的内存

这是两个数相加的cuda代码:

#include<iostream>
using namespace std;

__global__ void add(int a,int b,int *c)
{
*c=a+b;
}

int main(void)
{
int c;
int *dev_c;
cudaError_t error;
error=cudaMalloc((void**)&dev_c,sizeof(int));
if(error!= cudaSuccess)
{
cout<<"cudaMalloc d_A returned error"<<cudaGetErrorString(error)<<"code:"<<error<<" line"<<__LINE__<<endl;
exit(EXIT_FAILURE);
}
add<<<1,1>>>(2,7,dev_c);
error=cudaMemcpy(&c,dev_c,sizeof(int),cudaMemcpyDeviceToHost);
if(error!= cudaSuccess)
{
cout<<"cudaMemcpy returned error:"<<cudaGetErrorString(error)<<" code:"<<error<<" line:"<<__LINE__<<endl;
exit(EXIT_FAILURE);
}
cout<<"2+7="<<c<<endl;
cudaFree(dev_c);
return 0;
}

转载于:https://www.cnblogs.com/shrimp-can/p/5031116.html

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

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

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

### CUDA编程入门及相关资源 CUDA(Compute Unified Device Architecture)是由NVIDIA开发的一种并行计算平台和编程模型,允许开发者利用GPU的强大性能来加速应用程序。以下是关于CUDA编程的一些关键知识点以及推荐的学习资源。 #### 基础知识准备 在学习CUDA之前,建议先掌握一些必备的基础知识[^1]: - **C/C++ 编程**:由于CUDA编程基于C/C++,熟悉这两种语言对于理解和实现CUDA程序至关重要。 - **并行计算基础**:了解并行计算的基本概念可以帮助更好地理解CUDA的工作机制及其优化策略。 - **线性代数与矩阵运算**:这些数学工具广泛用于科学计算和机器学习领域,在实际应用中经常涉及CUDA技术。 #### 推荐学习材料 为了更高效地学习CUDA编程,可以参考以下几类优质资源: 1. **官方文档与教材** NVIDIA提供了详尽的官方文档作为权威参考资料[^2]。特别是《CUDA编程指南》系列书籍,其中文版本已被多位译者整理成易于阅读的形式[^4]。这类资料适合初学者从零起步,通过理论讲解配合实例演练的方式逐步深入理解核心概念。 2. **在线课程与教程集合** GitHub平台上存在大量开源项目专门针对不同层次用户的CUDA教学需求设计而成[^3]。例如,“how-to-optim-algorithm-in-cuda”仓库不仅包含了丰富的算法优化案例分析,还特别介绍了如何精通NVIDIA Tensor Core功能等内容。此类资源非常适合那些希望进一步提升技能水平或者专注于特定应用场景下的高性能解决方案探索的人群。 3. **动手实践的重要性** 无论采用何种形式获取信息,都应牢记一点——唯有不断练习才能真正掌握一门新技术。因此,在日常学习过程中应当注重将新学到的知识立即付诸行动,比如尝试模仿书中给出的例子构建自己的小型测试程序,并在此基础上逐渐增加复杂度直至能够独立完成较为完整的工程项目为止。 ```cpp // 示例代码展示了一个简单向量加法操作使用CUDA实现的方法 #include <iostream> __global__ void add(int *a, int*b ,int*c){ c[blockIdx.x]= a[blockIdx.x]+b[blockIdx.x]; } int main(){ const int N=10; int h_a[N],h_b[N],h_c[N]; // Host copies of vectors a,b,c // Initialize host arrays... int size=N*sizeof(int); int* d_a,*d_b,*d_c; // device copies of vectors a,b,c cudaMalloc(&d_a,size); // Allocate space on the GPU for each vector cudaMemcpy(d_a,h_a,size,cudaMemcpyHostToDevice); dim3 blocks(N),threads(1); add<<<blocks, threads>>>(d_a,d_b,d_c); cudaMemcpy(h_c,d_c,size,cudaMemcpyDeviceToHost); std::cout << "Resultant Vector is : "; for (int i = 0;i<N ;i++) { std::cout<<h_c[i]<<" "; } return 0; } ``` 以上片段展示了怎样定义核函数`add()`来进行两个整型数组相加的操作过程。注意这里仅作示范用途,请根据实际情况调整参数设置以满足具体业务场景的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值