c语言 cuda核函数,CUDA编程
这几天收拾准备准备GUP“库达”计算,开学搞搞计算机图形图像处理。暂且不说安装问题。关于CPU,gpu的介绍正在整理。。。。。
CUDA编程
1. 1核函数
定义:在GPU进行的函数通常称为核函数
一般通过__global__修饰(在核函数里,都用双下划线来修饰),调用通过<<>>,第一个参数代表block线程块数目,第二个参数代表线程块内含有的线程数目thread。
根据2可以看出它的操作单位是总的线程格的block。
调用时必须声明核函数的执行参数。
正式编程前必须使用cudaMalloc()函数先为wrap分配适当的内存空间。分配前要精打细算,因为总的内存空间一定,一个wrap分配不当的空间会导致其他线程内存不够用导致越界报错甚至死机。(蛮难,咦字面上)。
任何程序入门编程:
#include
#include
int main()
{
printf("Hello world\n");
}
乍一看,除了头文件多了一个以外,其他毫无区别。常说cuda编程用的是c语言,难道真的一成不变?
答:cuda编程面向GPU,但如果程序里并没有用到GPU处理,那就真的是一模一样。但如果上述程序你真的不想让显卡就这么闲着,你可以这样:
// 首先,修改文件后缀为.cu
#include
#include
//第一步:核函数申明
__global__void kernel(void)//注意:这里的返回值只能为void
{
}
int main(void)
{
//核函数的调用在主函数
kernel<<<1,1>>> ()
printf("Hello,world\n");
return 0;
}
1.2 dim3结构类型
dim3是基于unit3定义的矢量类型,表示3个数据成员unsigned int x;unsigned int y;unsigned int z;可用来表示一维、二维、三维线程块。
相关内置变量
2.1 gridDim,线程格的维度定义,即gridDim.x,gridDim.y,gridDim.z。
2.2 blockDim,线程块的维度,即同上。
2.3blockIdx,线程块ID的索引,及同上。
2.4threadIdx,线程ID的索引,即同上。
一维的block,包含的线程ID,threadId=threadIdx.x,但对于二维三维,存在以下计算公式:threadID=threadIdx+threadIdx.yblockDim.x;threadID=threadIdx.x+threadIdx.yblockDim.x+threadIdx.zblockDim.yblockDim.z。
计算线程索引偏移量为启动线程的总数。如stride=blockDim.x*gridDim.x;threadId+=stride
1.3函数修饰符
kernel核函数,在主机端调用kernel在设备端创建多个线程。
1.4常用的内存函数
cudaMalloc()
用处:用来分配全局存储器(提示:少用,容易沾满)
函数原型:cudaError_t cudaMalloc(void **devPtr,size_t size)
将cudaMalloc()分配的指针传递给设备和主机上。
cudaMemcpy()
用处:进行CPU与GPU的数据拷贝
cudaMemcpy(Md(gpu),M(原地址i)cudaMemcpyHostToDevice)
cudaFree()
函数原型:cudaError_t cuda Free
用处:释放内存与c函数free()一样。
GPU内存类型
全局内存
global memory,通常意义上的设备内存。
共享内存
shared memory,GPU的每个线程块位于一个相同的核处理器SM,之间共享内存。
形式:__shared__float a[i]
常量内存
constant memory,常量内存代替全局内存能有效的减少内存带宽。
要求:当我们要将数据拷贝到常量内存时,要使用cudaMemcpyToSymbol(),使用cudaMemcpy仍会拷贝到全局。
纹理内存
Texture memory从硬件角度来说,纹理内存实际上是存储在全局内存上;唯一的区别是,当某一个变量绑定纹理内存后,在程序运行过程中会将部分信息存储在纹理缓存中,以减少线程块对全局内存的读取,进而提高程序的运行速度。
使用:有两种方法:纹理参考与纹理对象。
一维纹理内存
用texture+类型声明。
cudaBindTexture()绑定到纹理内存中。
tex1Dfetch()读取纹理内存的数据。
二维纹理内存
texture texIn。
cudaBindTexture2D()绑定到纹理内存中。
通过tex2D()来读取纹理内存中的数据。
先写这里,补作业了!
标签:__,函数,编程,threadIdx,纹理,线程,CUDA,内存
来源: https://blog.csdn.net/qq_44605933/article/details/104729157
c语言 cuda核函数,CUDA编程相关推荐
- c语言 cuda核函数,CUDA核函数与线程配置
CUDA核函数 在GPU上调用的函数成为CUDA核函数(Kernel function),核函数会被GPU上的多个线程执行.每个线程都会执行核函数里的代码,当然由于线程编号的不同,执行的代码路径可能会 ...
- 英伟达CUDA太难!OpenAI出手要取代它,新语言性能相当但编程更简单
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 用CUDA为GPU编程实在太难了. 为了让没有CUDA编程经验的人写出和专家效率相当的GPU代码,现在OpenAI推出了一种新的语言和编译器 ...
- 【记录一个问题】cuda核函数可能存在栈溢出,导致main()函数退出后程序卡死30秒CUDA...
调试一个CUDA核函数过程中发现一个奇怪的问题: 调用某个核函数,程序耗时33秒,并且主要时间是main()函数结束后的33秒: 而注释掉此核函数,程序执行不到1秒. 由此可见,可能是某种栈溢出,导致 ...
- 详解CUDA核函数及运行时参数
详解CUDA核函数及运行时参数 核函数是GPU每个thread上运行的程序.必须通过__gloabl__函数类型限定符定义.形式如下: __global__ void kernel(param lis ...
- 【记录一个问题】linux+opencv+cuvid解码1080P视频,当使用CUDA核函数的时候,必然崩溃...
崩溃的信息如下: 1 OpenCV(4.1.0-dev) Error: Gpu API call (invalid configuration argument) in videoDecPostPro ...
- CUDA:核函数未执行,错误检查
最近在使用CUDA时,遇到某次代码在执行时,直接跳过CUDA核函数. 又由于CUDA程序本身不是非常便于调试,所以在此时如果能知道程序为什么会报错,对进一步代码改正会有非常大的帮助. 解决方案 在核函 ...
- 显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理
显卡.显卡驱动.CUDA.CUDA Toolkit.cuDNN 梳理 转自:https://www.cnblogs.com/marsggbo/p/11838823.html#nvccnvidia-sm ...
- 人工智能开发语言 python,python人工智能编程教程
python适合做人工智能的编程语言吗? 当然,Python是人工智能的首选语言.具体原因如下:Python在设计上坚持了清晰的风格,让Python成为了一门简单.易读.易维护的语言,让大量用户所欢迎 ...
- 一篇文章清晰了解NVIDAI显卡驱动(包括:CUDA、CUDA Driver、CUDA Toolkit、CUDNN、NCVV)
背景 开发过程中需要用到GPU时,通常在安装配置GPU的环境过程中遇到问题:比如:安装TensorFlow2.1过程中,想要使用到电脑的显卡来进行开发,但是发现默认需要CUDATOOLKIT=10.1 ...
最新文章
- 英语应用文写作之感谢信
- JavaScript实现数除以二divideByTwo算法(附完整源码)
- python 监控内存_使用python写一个监控不同机器的使用内存情况并使用flask出图
- WebService开发常用功能详解
- android开源数据库,Android Hawk数据库 github开源项目
- Django访问量和页面点击数统计
- ubuntu安装时出现11:资源暂时不可用
- Oracle 11g下载及安装
- 【基于遥感解译与GIS技术】土地利用图、植被类型图、植被覆盖度图、土壤侵蚀制图
- 基于winrm实现远程操作win
- Yate for mac(标记和管理音频文件工具)
- SQL Server 数据库之数据完整性
- 一个程序员的真实故事上
- IC卡16个扇区简介
- Vue知识点总结(16)——具名插槽(超级详细)
- Termios 函数说明
- 发表论文被拒?只因你没注意这几点
- 接口测试自动化的思考与总结
- H1B工作签证紧俏 “中签率”低对中国留学生影响大-中新网
- linux对4T硬盘进行分区