cudaMemcpy与kernel
来源:互联网 发布:傲梦编程素质教育 编辑:程序博客网 时间:2024/06/05 05:16
Memory操作
cuda程序将系统区分成host和device,二者有各自的memory。kernel可以操作device memory,为了能很好的控制device端内存,CUDA提供了几个内存操作函数:
为了保证和易于学习,CUDA C 的风格跟C很接近,比如:
cudaError_t cudaMalloc ( void** devPtr, size_t size )
我们主要看看cudaMencpy,其函数原型为:
cudaError_t cudaMemcpy ( void* dst, const void* src, size_t count,cudaMemcpyKind kind )
其中cudaMemcpykind的可选类型有:
- cudaMemcpyHostToHost
- cudaMemcpyHossToDevice
- cudaMemcpyDeviceToHost
- cudaMemcpuDeviceToDevice
具体含义很好懂,就不多做解释了。
对于返回类型cudaError_t,如果正确调用,则返回cudaSuccess,否则返回cudaErrorMemoryAllocation。可以使用char* cudaGetErrorString(cudaError_t error)将其转化为易于理解的格式。
组织线程
掌握如何组织线程是CUDA编程的重要部分。CUDA线程分成Grid和Block两个层次。
由一个单独的kernel启动的所有线程组成一个grid,grid中所有线程共享global memory。一个grid由许多block组成,block由许多线程组成,grid和block都可以是一维二维或者三维,上图是一个二维grid和二维block。
这里介绍几个CUDA内置变量:
- blockIdx:block的索引,blockIdx.x表示block的x坐标。
- threadIdx:线程索引,同理blockIdx。
- blockDim:block维度,上图中blockDim.x=5.
- gridDim:grid维度,同理blockDim。
一般会把grid组织成2D,block为3D。grid和block都使用dim3作为声明,例如:
dim3 block(3);// 后续博文会解释为何这样写griddim3 grid((nElem+block.x-1)/block.x);
需要注意的是,dim3仅为host端可见,其对应的device端类型为uint3。
启动CUDA kernel
CUDA kernel的调用格式为:
kernel_name<<<grid, block>>>(argument list);
其中grid和block即为上文中介绍的类型为dim3的变量。通过这两个变量可以配置一个kernel的线程总和,以及线程的组织形式。例如:
kernel_name<<<4, 8>>>(argumentt list);
该行代码表明有grid为一维,有4个block,block为一维,每个block有8个线程,故此共有4*8=32个线程。
注意,不同于c函数的调用,所有CUDA kernel的启动都是异步的,当CUDA kernel被调用时,控制权会立即返回给CPU。
函数类型标示符
__device__ 和__host__可以组合使用。
kernel的限制:
- 仅能获取device memory 。
- 必须返回void类型。
- 不支持可变数目参数。
- 不支持静态变量。
- 不支持函数指针。
- 异步。
- cudaMemcpy与kernel
- cudaMemcpy与cudaMemcpyAsync的区别
- CPU 与 GPU 之间数据转换 cudaMemcpy
- cudaMemcpyToSymbol 和cudaMemcpy
- android kernel 与文件系统
- android kernel 与文件系统
- android kernel 与文件系统
- kernel与文件系统通信
- Android kernel与普通kernel的区别
- Kernel地图:Kconfig与Makefile
- android 与kernel的通信
- Loongson Kernel编译与使用
- (2.6kernel)io_remap_page_range()与io_remap_pfn_range()
- wpa_supplicant与kernel的接口
- wpa_supplicant与kernel的接口
- wpa_supplicant与kernel的接口
- wpa_supplicant与kernel的接口
- v880 kernel 下载与解压
- jedis 集群模式下连接redis原理
- Python Scapy(2.3.1)文档学习(五):构建自己的工具
- jw_player的使用方法
- java设计模式 之建造者模式
- PostgreSQL 强大的多层表继承--及其在海量数据分类按月分区存储中的应用
- cudaMemcpy与kernel
- Python Scapy(2.3.1)文档学习(六):添加新的协议
- linux文件学习6
- Spring中Bean的命名
- cocos2dx移植android平台
- 用c语言实现模拟用户登录程序以及猜数字游戏
- quartz的使用
- Python Scapy(2.3.1)文档学习(七):故常排除
- 用OSX给树莓派安装系统