免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2338 | 回复: 5

[C++] 条件编译太多如何优化 [复制链接]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2017-02-15 23:14 |显示全部楼层
类似下面这种情况,如果不想在一个函数里有这么多的条件编译,应该如何优化。

  1. inline void SyncedMemory::to_cpu() {
  2.   switch (head_) {
  3.     case UNINITIALIZED: {
  4.       CaffeMallocHost(&cpu_ptr_, size_, device_);
  5.       caffe_memset(size_, 0, cpu_ptr_);
  6.       head_ = HEAD_AT_CPU;
  7.       own_cpu_data_ = true;
  8.       break;
  9.     }
  10.     case HEAD_AT_GPU: {
  11. #ifndef CPU_ONLY
  12.       if (cpu_ptr_ == nullptr) {
  13.         CaffeMallocHost(&cpu_ptr_, size_, device_);
  14.         own_cpu_data_ = true;
  15. #ifdef USE_GREENTEA
  16.         CHECK_EQ(own_zero_copy_data_, false)
  17.            << "Allocate host memory for a zero copy buffer.";
  18. #endif
  19.       }

  20.       if (device_->backend() == Backend::BACKEND_CUDA) {
  21. #ifdef USE_CUDA
  22.         caffe_gpu_memcpy(size_, gpu_ptr_, cpu_ptr_);
  23. #endif  // USE_CUDA
  24.       } else {
  25. #ifdef USE_GREENTEA
  26.         viennacl::ocl::context &ctx = viennacl::ocl::get_context(
  27.             device_->id());
  28.         if (!own_zero_copy_data_) {
  29.           greentea_gpu_memcpy(size_, (cl_mem) gpu_ptr_, 0, cpu_ptr_, &ctx);
  30.         } else {
  31.           void *mapped_ptr = clEnqueueMapBuffer(ctx.get_queue().handle().get(),
  32.                                 (cl_mem) gpu_ptr_,
  33.                                 true,
  34.                                 CL_MAP_READ | CL_MAP_WRITE,
  35.                                 0, size_, 0, NULL, NULL, NULL);
  36.           CHECK_EQ(mapped_ptr, cpu_ptr_)
  37.             << "Device claims it support zero copy"
  38.             << " but failed to create correct user ptr buffer";
  39.           clEnqueueUnmapMemObject(ctx.get_queue().handle().get(),
  40.                                   (cl_mem) gpu_ptr_,
  41.                                   mapped_ptr, 0, NULL, NULL);
  42.         }
  43.         ctx.get_queue().finish();
  44. #endif
  45.       }
  46.       head_ = SYNCED;
  47. #else
  48.       NO_GPU;
  49. #endif  // !CPU_ONLY
  50.       break;
  51.     }
  52.     case HEAD_AT_CPU:
  53.     case SYNCED:
  54.       break;
  55.   }
  56. }
复制代码


论坛徽章:
315
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2017-02-16 08:49 |显示全部楼层
分别拆成多个方法

论坛徽章:
220
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:53操作系统版块每日发帖之星
日期:2016-05-10 19:22:58月度论坛发贴之星
日期:2016-01-31 22:25:02操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
发表于 2017-02-17 11:00 |显示全部楼层
可以看看借鉴一下kernel的代码,汇编也用上了,



有时为了性能,工程师也是蛮拼的

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2017-02-17 13:28 |显示全部楼层
hellioncu 发表于 2017-02-16 08:49
分别拆成多个方法

      
      不能改变原设计接口。

      类似的代码还有很多,看了一下共有三种情况,CPU_ONLY, USE_CUDA,USE_GREENTEA  我不习惯 if 和 #ifdef 这样的交叉。


论坛徽章:
315
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2017-02-17 13:48 |显示全部楼层
zhujiang73 发表于 2017-02-17 13:28
不能改变原设计接口。

      类似的代码还有很多,看了一下共有三种情况,CP ...

三种情况如果代码差别较大,那就内部分三种写,稍微冗余一些代码,这样看起来容易些

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-02-12 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2017-02-19 21:53 |显示全部楼层
改变这样发风格,如果采用分模块的话,就要引入模块,那么在运行时不就增加开销了吗。当前至少编译器的开销,怕什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP