当前位置: 首页 > wzjs >正文

网站建设培训西安哈尔滨网站备案手续费

网站建设培训西安,哈尔滨网站备案手续费,wordpress友情链接激活,特殊字体CUDA C编程笔记 第三章 CUDA执行模型3.5 循环展开3.5.1 展开的规约 待解决的问题: 第三章 CUDA执行模型 3.5 循环展开 循环展开是一种循环优化的技术,通过减少分支出现频率循环维护指令。 循环主体代码被多次编写,任何封闭的循环可以把迭代…

CUDA C编程笔记

  • 第三章 CUDA执行模型
    • 3.5 循环展开
      • 3.5.1 展开的规约

待解决的问题:

第三章 CUDA执行模型

3.5 循环展开

循环展开是一种循环优化的技术,通过减少分支出现频率+循环维护指令。
循环主体代码被多次编写,任何封闭的循环可以把迭代次数减少或完全删除。

循环展开因子:循环体的复制数量
迭代次数=原始迭代次数/循环展开因子
在顺序数组中,如果循环迭代的次数在执行前已经知道,循环展开是最有效提升性能的方法。

举一个简单的例子:

for(int i = 0; i < 100; i++){a[i] = b[i] + c[i];
}for(int i = 0; i < 100; i += 2){a[i] = b[i] + c[i];a[i+1] = b[i+1] + c[i+1];
}

下面的循环迭代次数是上面的一半,这是因为重复操作了一次循环体。
这种提升是由于编译器执行循环展开时低级指令的改进和优化。

目标:通过减少指令消耗和增加更多的独立调度指令来提高性能,更多的并发操作被添加到流水线上,产生更高的指令和内存带宽,帮线程束调度器提供更多符合条件的线程束,隐藏指令或内存延迟。

3.5.1 展开的规约

用一个线程块手动处理两个数据块,每个线程作用域多个数据块,并处理每个块的一个元素

//展开规约1:手动展开两个块block的处理
__global__ void reduceUnrolling2(int *g_idata, int *g_odata, unsigned int n){//设置线程idunsigned int tid = threadIdx.x;unsigned int idx = blockIdx.x * blockDim.x * 2 + threadIdx.x;//这里乘2//把全局数据指针转换为块内局部指针int *idata = g_idata + blockIdx.x * blockDim.x * 2;//这里乘2//展开两个数据块if(idx + blockDim.x < n) g_idata[idx] += g_idata[idx + blockDim.x];//每个线程都加一个相邻块的元素,可以算一个迭代,该循环可在数据块间规约__syncthreads();//在全局内存中就地规约for(int stride = blockDim.x/2; stride > 0; stride >>= 1){if(tid < stride){idata[tid] += idata[tid + stride];}__syncthreads();}//把这个块的结果写回全局内容if(tid == 0) g_odata[blockIdx.x] = idata[0];
}

可以利用线程块的空闲资源,原本一个线程块中,只有前半个线程块在工作,后半个线程块闲置(交错规约)。把两个数据块一起处理后,后半个线程块也能利用起来

关键点:
①索引的计算

unsigned int idx = blockIdx.x * blockDim.x * 2 + threadIdx.x;
int *idata = g_idata + blockIdx.x * blockDim.x * 2;

在这里插入图片描述

②数据规约

if (idx + blockDim.x < n) g_idata[idx] += g_idata[idx + blockDim.x];

第一个块的内容与第二个块相加,数据存回第一个块。

③块内交错规约

for (int stride = blockDim.x/2; stride > 0; stride >>= 1) {if (tid < stride) {idata[tid] += idata[tid + stride];}__syncthreads();
}

完成数据块内的规约,交错规约。

对应的main函数代码也需要修改:网格大小减半,在核函数调用参数、数据传回主机和最后求和方面,都需要除2

//kernel4:reduceUnrolling2 展开规约2:一个线程块处理两个数据块cudaMemcpy(d_idata, h_idata, bytes, cudaMemcpyHostToDevice);cudaDeviceSynchronize();iStart = seconds();//因为现在每个线程块处理两个数据块,需要调整内核的执行配置,网格大小减为原来的一半reduceUnrolling2<<<grid.x/2, block>>>(d_idata, d_odata, size);//这里写错成了bytescudaDeviceSynchronize();iElaps = seconds() - iStart;cudaMemcpy(h_odata, d_odata, grid.x/2*sizeof(int), cudaMemcpyDeviceToHost);//需要除2gpu_sum = 0;for(int i = 0; i<grid.x/2; i++){//需要除2gpu_sum += h_odata[i];}printf("gpu reduceUnrolling2    elapsed %f ms gpu_sum: %d <<<grid %d block %d>>>\n", iElaps, gpu_sum, grid.x/2, block.x);//需要除2

执行结果:

./3-3reduceInteger2 starting reduction atdevice 0: NVIDIA GeForce RTX 3090 with array size 16777216 grid 32768 block 512
cpu reduce         elapsed 0.039772 ms cpu_sum: 2139353471
gpu Warmup          elapsed 0.003663 ms gpu_sum: 0 <<<grid 32768 block 512>>>
gpu Neighbored          elapsed 0.001532 ms gpu_sum: 2139353471 <<<grid 32768 block 512>>>
gpu NeighboredLess      elapsed 0.001402 ms gpu_sum: 2139353471 <<<grid 32768 block 512>>>
gpu reduceInterleaved    elapsed 0.001371 ms gpu_sum: 2139353471 <<<grid 32768 block 512>>>
gpu reduceUnrolling2    elapsed 0.001357 ms gpu_sum: 2139353471 <<<grid 16384 block 512>>>

原始的交错规约时间reduceInterleaved0.001371 ms,二合一的交错规约reduceUnrolling20.001357 ms。

原因:一个线程中有更多的独立内存加载/存储操作性能更好,因为内存延迟可以被更好隐藏,可以查看设备内存吞吐量指标,内存吞吐量提高了很多。
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/wzjs/818178.html

相关文章:

  • 大学网站建设的目标与思路中国商标网官方查询系统
  • 如何做快递api接口网站桂林象鼻山照片
  • 建湖专业做网站的公司公司网站的开发策略
  • wordpress 安装 数据库连接错误宁波网站优化方法
  • 友情链接交换网站微商营销软件商城
  • 一么多设计公司关键词优化的五个步骤
  • 招工网站怎么做东海做网站公司
  • 广安网站建设公司学历提升机构的套路
  • 时光慢网站建设方案论文seo网络优化公司
  • 网站页面设计代码谷歌推广关键词匹配
  • 象山网站优化公司沧州微酷网络科技有限公司
  • 便宜购 网站建设爱链在线
  • 旅游品牌网站的建设莱芜正规的网站建设
  • 建视频网站的费用深圳百度推广开户
  • c语言做网站可用的ftp网站
  • 广东企业网站seo哪家好怎样用jsp做网站 新手教程
  • 网站 设计 电商自助网站免费建站平台
  • 网站建设方案及深圳蚂蚁网络
  • 镇江网站建设优化案例分析北京游戏软件开发公司
  • 口碑营销方案珠海做网站优化的公司
  • 网站源码小千个人网免费制作app软件教程
  • 河北中保建设集团网站首页增城网站建设服务
  • 网站建设公司的会计分录约么同城实时定位搜索引擎
  • 购物网站建设需求模板下载电子商务平台经营者对
  • 织梦网站访问量统计代码如何创建微信小程序
  • 网站设计开发招聘做网站seo的公司哪家好
  • 云南省工程建设交易系统网站seo站外推广业务外包
  • 福建省分行建设银行网站wordpress 获取标题
  • 装修做劳务去哪个网站找工地做网站架构需要注意什么
  • 怎么做vip电影网站网页设计尺寸多少比较好