More Related Content
Similar to introduction to cuda
Similar to introduction to cuda (20)
introduction to cuda
- 2. 什么是CUDA
• CUDA的全称是Compute Unified Device
Architecture, 是NVIDIA® 公司的并行计
算架构,主要是要来利用GPU的计算能
力,来提高计算性能。进一步的说是在
GPU上提供标准C编程语言,为在支持
CUDA的NVIDIA GPU上进行并行计算而提
供了统一的软硬件解决方案。
- 4. 为什么GPU快
• 图片中绿色的是ALU(运算器),可以看到,
CPU只有4个ALU,而GPU中的ALU多很多,并
且GPU中把更多的晶体管用于数据处理方面。之
所以这样是因为CPU和GPU的功能不一样,CPU
要考虑上下文切换等所以需要复杂的控制单元和
缓存来提高执行效率,而GPU不需要那样复杂的
控制逻辑,所以GPU可以通过增加并行处理单元
和存储控制单元来提供处理能力和存储器带宽。
因而同期的GPU的计算能力会比CPU高很多个档
次。为了充分利用GPU的运算能力,就有了现在
的CUDA编程。
- 6. GPU运算的缺点
• 显示芯片的运算单元数量很多,因此对于不能高
度并行化的工作,所能带来的帮助就不大。
• 显示芯片目前通常只支持 32 bits 浮点数,且多半
不能完全支持 IEEE 754 规格, 有些运算的精确
度可能较低。目前许多显示芯片并没有分开的整
数运算单元,因此整数运算的效率较差。
• 显示芯片通常不具有分支预测等复杂的流程控制
单元,因此对于具有高度分支的程序,效率会比
较差。
- 7. CUDA代码
• __global__ static void HelloCUDA(char* result, int num){
• int i = threadIdx.x;
• char p_HelloCUDA[] = "Hello CUDA!";
• if(i < num) result[i] = p_HelloCUDA[i];
• }
• int main(int argc, char* argv[]){
• if(!InitCUDA()) {
• return 0;
• }
• char *device_result = 0;
• char host_result[12] ={0};
• cudaMalloc((void**) &device_result, sizeof(char) * 11);
• HelloCUDA<<<1, 11, 0>>>(device_result, 11);
• cudaMemcpy(host_result, device_result, sizeof(char) * 11, cudaMemcpyDeviceToHost);
• printf("%sn", host_result);
• cudaFree(device_result);
• return 0;
• }
- 8. CUDA代码
• CUDA编程中用__global__来表示这是个可以有
CPU调用的运行在GPU上的一个函数。由于GPU
访问数据都是在显存中获取的,所以我们需要调
用cudaMalloc在显存中开辟空间,用法类似于在
内存中开辟空间的malloc。之后调用函数
HelloCUDA<<<1, 11, 0>>>(device_result, 11);尖
括号中有三项,分别表示block的数量,thread的
数量,和共享内存的大小。用threadIdx.x我们可
以获取thread的编号,来达到并行的效果。最后
我们需要调用cudaMemcpy把数据从显存中取回
到内存中,并释放显存中的数据,这样cpu就可以
获得最后的结果了。
- 12. CUDA架构
• 用__global__修饰的函数被称作一个kernel函数或者是叫
做一个kernel,一个kernel会有一个grid(目前是,据说以
后可能会是多个),一个grid包含多个block,一个block
包含多个thread,thread就类似于平常cpu运算中的线程
thread。这样的排布是因为我们需要不同粒度的并行,处
于同一个block的thread可以通过共享内存来交换数据,而
不同block的thread不能直接共享数据。为了能更方便的运
算一二三维的数组,grid中的block或者是block中的thread
都可以按照不同的维度来排布,比如如果block中的thread
按照二维排布的话,我们可以通过threadIdx.x和
threadIdx.y来获得当前thread的位置,这样的结构使得运
算二维或三维数组更加自然,而且可以避免除法和取余操
作,加快了速度。
- 14. 硬件结构
• stream processor流处理器,一般商家号称
GPU有多少核,一般都是指有多少流处理
器,流处理器拥有自己的寄存器和local
memory,但是sp不是真正地核,他没有前
端
• stream multiprocessor 流多处理器,一般
一个流多处理器包含8个流处理器,sm有前
端,就是说他有取指令的部件