基于GPU的cuda和opencl学习

线程、进程、内核

     线程通常被定义为一个进程中代码的不同执行路线,一个进程可包含多个线程。从实现方式上划分,线程有两种类型:"用户级线程"和"内核级线程

 

 

Guda的逻辑结构和内存结构

host(在cpu上执行)

device(在gpu上执行的部分,又称为kernel)

cuda的执行过程:

1、 host程序将需要并行计算的数据复制到gpu显存

2、gpu执行device程序,

3、完成后,由host程序将结果从gpu显存中取回

 

 

grid中的block数量由系统中处理器个数或待处理的数据量决定,block有built-in变量blockDim(block dimension)和blockIdx(block index)。  

 

 

 

 

   网格的划分(block个数,线程数/block),根据实际中的任务来划分:总启动的线程=总共的任务。

            例如:((n+255)/256,256)  

二、opencl 

硬件结构

 

2内存架构

 

网格(全局线程个数,线程/group)注意:线程/group由硬件决定,英美达为32倍数,AMD为64的倍数

eg:矩阵与矢量相乘

串行

for(i=0;i<hm;i++)

{dot=0;

 for(j=0;j<Wm;j++)

  dot+=M [ i * Wm + j ] * V[j];

W[ i ]=dot;

}

 

a、完全可以按每个线程分配一个任务完成。

例如2565个,256个线程/group;需要11个workgroup,网格(256*11,256)

参数获得:

 核编号的获得-----idx=get_global_id(0)

全局线程个数-----get_global_size(0)

 

 每个核对应每一行,get_global_id(0)获得的核编号,对应矩阵的每行编号。( 其中M为矩阵指针首地址。)

 

 

b、不能按每个线程分配一个任务一次完成。

  例如2565个,256个线程/group; 网格(640,256)需要每次执行四个线程,

 

c、按照workgroup划分

 网格(设置的全局线程,线程/group,workgroup)=(640,64,10)(2565)

 

posted @ 2018-03-11 20:32  zjkl_欧了  阅读(1208)  评论(0编辑  收藏  举报