c++实现maxpooling+利用OpenMP、SIMD优化代码

上传人:lil****ar 文档编号:333429836 上传时间:2022-09-02 格式:PDF 页数:7 大小:155.56KB
返回 下载 相关 举报
c++实现maxpooling+利用OpenMP、SIMD优化代码_第1页
第1页 / 共7页
c++实现maxpooling+利用OpenMP、SIMD优化代码_第2页
第2页 / 共7页
c++实现maxpooling+利用OpenMP、SIMD优化代码_第3页
第3页 / 共7页
c++实现maxpooling+利用OpenMP、SIMD优化代码_第4页
第4页 / 共7页
c++实现maxpooling+利用OpenMP、SIMD优化代码_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《c++实现maxpooling+利用OpenMP、SIMD优化代码》由会员分享,可在线阅读,更多相关《c++实现maxpooling+利用OpenMP、SIMD优化代码(7页珍藏版)》请在金锄头文库上搜索。

1、c+实现maxpooling+利OpenMP、SIMD优化代码1.概述最近接触了个问题,如何c+去实现图像中的maxpooling操作,在上找了些资料,发现只有些简单的实现算法,这些算法实际运复杂度较。因此,本,探究了如何利c+的多线程(OpenMP)、“条指令操作多个数据”()等向出发,优化maxpooling操作。2. maxpooling参考博客中的理解,整个图被不重叠的分割成若个同样的块(pooling size)。每个块内只取最的数字,再舍弃其他节点后,保持原有的平结构得出 output。 在这篇章中设定最池化操作的参数kernel_size=3,stride=2,padding=1

2、(在图像周围填充格0),那么在输矩阵src1为:1124567832101234最池化的结果应该为68683.pytorch实现和c+实现pytorchc+(版本1) 1/求maxpooling操作2 vectorvectorvectorvector maxpooling()2 vectorvectorvectorvector maxpooling()3 int batch = src1.size(); int channel = src10.size();4 int height=src100.size(); int width=src1000.size();5 int out_h = (h

3、eight-3+2)/2, out_w = (width-3+2)/2;6 int mod_h = (height-3+2)%2, mod_w =(width-3+2)%2;7 if (mod_h != 0) out_h+;8 if (mod_w != 0) out_w+;9 10 /先填充11 vectorvectorvectorvector pad_map;12 for(int b=0;bbatch;b+)13 vectorvectorvector c_tmp;14 for(int c=0;cchannel;c+)15 vectorvector h_tmp(height+2,vector(

4、width+2,0);16 for(int h=0;hheight+2;h+)17 for(int w=0;w=1&h=1&wwidth+2-1)19 h_tmphw=src1bch-1w-1;20 21 22 23 c_tmp.push_back(h_tmp);24 25 26 pad_map.push_back(c_tmp);27 c_tmp.clear();28 29 / coutpad_map.size()#; 30 31 32 /求maxpoling后的结果33 vectorvectorvectorvector pool_out;34 vectorvectorvectorvector

5、vector max_index;35 for(int b=0;bbatch;b+)36 vectorvectorvector c_tmp;37 vectorvectorvectorvector c_index;38 39 for(int c=0;cchannel;c+)40 vectorvector res(out_h, vector(out_w, 0);41 vectorvectorvector res_index;42 for(int i=0;iout_h;i+)43 vectorvector tmp;44 for (int j = 0; j out_w; j+)45 46 int st

6、art_x = i*2;47 int start_y = j*2;48 / vector temp;49 int max_ele=pad_mapbcstart_xstart_y;50 vector m_idx(2,0);51 for(int ii=0;ii3;ii+)52 for (int jj = 0; jj max_ele)56 max_ele=pad_mapbcstart_x + iistart_y + jj;57 m_idx0=(start_x + ii);58 m_idx1=(start_y+jj);59 60 61 62 63 / sort(temp.begin(), temp.e

7、nd();64 tmp.push_back(m_idx);65 resij = max_ele;66 67 res_index.push_back(tmp);从代码中可以看到maxpooling的操作,就是就是先填充,然后取滑动窗中数值的最值,可以看出来计算maxpooling的操作需要六层循环,batch*channel*out_h*out_w*3*3,可见复杂度挺的。4. 代码优化(1)版本1的代码中存在着量vector的插、删除操作(哈哈,还不是很熟悉c+),这些操作消耗了量时间;(2)引OpenMP,利多线程操作,完成最值池化,可以参考;(3)gcc编译器本存在代码优化,利-O3操作,

8、对代码进动优化;最终优化的代码C+67 res_index.push_back(tmp);68 tmp.clear();69 70 c_tmp.push_back(res);71 c_index.push_back(res_index);72 res_index.clear();73 res.clear();74 75 pool_out.push_back(c_tmp);76 max_index.push_back(c_index);77 c_index.clear();78 c_tmp.clear();79 80 argmax_index=max_index;81 82 return poo

9、l_out;83 1/求maxpooling操作2 vectorvectorvectorvectorvector maxpooling(vectorvectorvectorvector &res)3 coutclock()endl;4 int batch = src1.size(); int channel = src10.size();5 int height=src100.size(); int width=src1000.size();6 int out_h = (height-3+2)/2, out_w = (width-3+2)/2;7 int mod_h = (height-3+2

10、)%2, mod_w =(width-3+2)%2;8 if (mod_h != 0) out_h+;9 if (mod_w != 0) out_w+;10 / coutout size;11 / coutout_h ;12 / coutout_wendl;13 / coutclock()endl;14 /先填充15 / vectorvectorvectorvector pad_map(batch,vectorvectorvector(channel,vectorvector(height+2,vector(width+2,0);16 / #pragma omp parallel num_th

11、reads(4)17 / 18 / #pragma omp for19 / for(int b=0;bbatch;b+)20 / for(int c=0;cchannel;c+)21 / for(int h=0;hheight+2;h+)22 / for(int w=0;w=1&h=1&wwidth+2-1)24 / pad_mapbchw=src1bch-1w-1;25 / 26 / 27 / 28 29 / 30 / 31 / 32 coutclock()endl;33 / coutpad_map;34 / coutpad_map.size() ;34 / coutpad_map.size

12、() ;35 / coutpad_map0.size() ;36 / coutpad_map00.size() ;37 / coutpad_map000.size()endl;38 39 /求maxpoling后的结果40 / vectorvectorvectorvector pool_out;41 / pool_out.resize(channel);42 vectorvectorvectorvector pool_out;43 vectorvectorvectorvectorvector max_index;44 max_index.resize(batch);45 pool_out.re

13、size(batch);46 #pragma omp parallel for47 for(int b=0;bbatch;b+)48 pool_outb.resize(channel);49 max_indexb.resize(channel);50 for(int c=0;cchannel;c+)51 pool_outbc.resize(out_h);52 max_indexbc.resize(out_h);53 for(int i=0;iout_h;i+)54 pool_outbci.resize(out_w);55 max_indexbci.resize(out_w);56 for(in

14、t j=0;jout_w;j+)57 max_indexbcij.resize(2);58 59 60 61 62 63 64 /vectorvectorvectorvector pool_out(batch,vectorvectorvector(channel,vectorvector(out_h,vector(out_w,0);65 /vectorvectorvectorvectorvector max_index(batch,vectorvectorvectorvector(channel,vectorvectorvector(out_h,vectorvector(out_w,vecto

15、r(2,0);66 67 68 / cout2222endl; 69 coutclock()endl; 70 / #pragma omp parallel num_threads(4)71 / 72 #pragma omp parallel for73 for(int b=0;bbatch;b+)74 75 for(int c=0;cchannel;c+)76 77 for(int i=0;iout_h;i+)78 79 for (int j = 0; j out_w; j+)80 81 82 int max_ele=INT_LEAST32_MIN;83 max_indexbcij0=(i*2

16、);84 max_indexbcij1=( j*2);85 for(int ii=0;ii3;ii+)86 for (int jj = 0; jj max_ele)92 max_ele=src1bctmp_x-1tmp_y-1;93 max_indexbcij0=(tmp_x);94 max_indexbcij1=(tmp_y);95 96 97 98 pool_outbcij=max_ele;99 5.实际测试的时间消耗在设置输矩阵的维度为32,64,112,112代码时间消耗(s)版本110.69+(优化vector的使)4.67+openMp3.62+gcc本指令优化(O3)0.416.SMID在maxpooling上,暂时没想到较好的单条指令多数据并的式,因此在元素求和上进了些尝试。c+代码99 100 101 102 103 / 104 coutclock()endl;105 / cout#endl;106 / argmax_index=max_index;107 coutclock()endl;108 res=pool_out;109 110 return max_inde

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号