关于宏和inline的PK--答王寅同学

肖舸

关于宏和inline的PK--答王寅同学

原话点这里

 

肖舸 17小时前

在关于开发规范的帖子里,我和王寅同学有一大段关于宏和inline函数的PK,感觉比较有代表性,这里摘录出来单独开贴,欢迎大家讨论。

  • 王寅(C/C++学生)
    删除 回复 #223
    王寅(C/C++学生) 2009-05-17 23:25
    普罗通信西安有限公司 肖舸(C/C++老师): 我们的规定,程序中永远不准使用直接的常数。任何常数必须用宏表明其含义。
    只准有两个地方出现常数
    for(i=0;i<n;i++)
    while(1)
    0,1是唯一被允许使用的常数。
    c++中优先使用const定义常量,而不是预处理指令#define。《effective c++》上说的。
  • 肖舸
    编辑 删除 #224
    肖舸 2009-05-18 08:29
    王寅(C/C++学生): c++中优先使用const定义常量,而不是预处理指令#define。《effective c++》上说的。
    都可以。
    C++建议是const。但const无法替代#define
    比如你想做个函数型宏,固化一个算法,const无法做到的。
    #define ADD(a,b) (a+b)

    C和C++走到今天,已经很成熟了,每一条语句,都有其不可替代的作用,仅仅就个人观点,来贸然论断某条语句是不合理的,这本身就是不合理的。
    目前很多书,为了强调作者的论点,故意极端化某些论断,给读者带来了很多误导,读者在读的时候,应该仔细甄别,去伪存真。

 

 

  • 王寅(C/C++学生)
    删除 回复 #227
    王寅(C/C++学生) 2009-05-18 16:20
    普罗通信西安有限公司 肖舸(C/C++老师): 都可以。
    C++建议是const。但const无法替代#define
    比如你想做个函数型宏,固化一个算法,const无法做到的。
    #define ADD(a,b) (a+b)

    C和C++走到今天,已经很成熟了,每
    老师所说的用宏定义函数型宏,我觉得在C++中应该用inline,比如
    #define Multiply(A,B) A*B
    如果我这样写 Multiply(a+b,c+d),就会是a+b*c+d,而不是(a+b)*(c+d),这样很容易误用
  • 肖舸
    编辑 删除 #228
    肖舸 2009-05-18 16:33
    王寅(C/C++学生): 老师所说的用宏定义函数型宏,我觉得在C++中应该用inline,比如
    #define Multiply(A,B) A*B
    如果我这样写 Multiply(a+b,c+d),就会是a+b*c+d,而不是(a+b)*(c+d),这样很
    都可以。
    我的习惯,简单的用函数宏,复杂的用inline。
    这个没有必要争执的。我没有强迫大家用,你也不要强迫我用,好不好?

    嗯,你说的错误,不存在,这是你没有养成好习惯造成的,我们规定,写计算公式,一律不准使用C或C++默认的运算优先级,所有的计算程序员自己用小括号界定优先级。还有就是,函数型宏建议内部仅有一个运算符,并且都用括号括住。

    比如你的例子应该这样改
    #define ADD(a,b) (a+b)
    #define Multiply(a,b) (a*b)
    你的例子应该写成
    Multiply(ADD(ab),ADD(cd))
    这样写就没有错误了。

    记住,别相信默认运算优先级,人的记忆是靠不住的,用括号显式定义。
  • 王寅(C/C++学生)
    删除 回复 #230
    王寅(C/C++学生) 55分钟前
    普罗通信西安有限公司 肖舸(C/C++老师): 都可以。
    我的习惯,简单的用函数宏,复杂的用inline。
    这个没有必要争执的。我没有强迫大家用,你也不要强迫我用,好不好?

    嗯,你说的错误,不存在,这是你没有养成好习惯造成
    如果是这样呢,
    define Max(a,b) (a)>(b)?(a):(b)
    客户这样用
    int a = 10;
    int b = 10;
    Max(++a,b+2)//a被加了一次
    Max(++a,b)//a被加了两次
    一个函数会有这样的不确定行为吗,如果用inline就不会出现这种情况,因为inline函数完全遵守函数行为。
    宏是没有类型检查的,这就是说,任何提供宏所用到的操作符的类型都可以作宏的参数,这是不安全的,况且宏的参数没有函数的参数的特性,比如const,引用等。
    照你的习惯,简单的用宏,这个Max够简单了吧,用宏一样有问题,复杂的用年inline,那很抱歉,那很可能被编译器拒绝。
    至于我说用const定义常量,那是因为宏只做文本替换,定义的宏根本就不能进入编译器的符号表,在调试程序的时候只会看到宏的值,而const定义可以 看到变量名,这样显然更清楚,尤其是在宏定义较多的时候,根本记不得哪个宏的值是多少。还有一点,如果用const整个程序只会有一个常量拷贝,而用宏的 话,每一个被替换的地方,就会占用存储空间,用宏就会占用跟多的空间。
  • 肖舸
    编辑 删除 #231
    肖舸 19分钟前
    王寅(C/C++学生): 如果是这样呢,
    define Max(a,b) (a)>(b)?(a):(b)
    客户这样用
    int a = 10;
    int b = 10;
    Max(++a,b+2)//a被加了一次
    Max(++a,b)//a被加了两次
    一个函数会有这样
    嗯,你说的都有道理。
    不过,我感觉你有点钻牛角尖了。
    任何一个用法,如果滥用,都会引发错误。
    你举的例子,就是典型的滥用宏。

    为什么呢?
    因为宏不是函数,最好处理简单的计算,函数型宏的目的,是固化一个计算。下次大家要用到这个计算的时候,都用这个宏,而不要每次都写,一旦计算因为需求改 变,则只需要修改宏一处就可以了,这是宏设置的本意,相当于一个纯文本的拷贝。降低程序员工作量的。

    举个例子讲:
    我们假定一块缓冲区的指针,偏移2字节的位置,是一个关键变量,一般我们在程序中,会这么写,*(p+2),但是这么写,如果有天我们的用法变了,偏移量变成3了,我们就要到每个地方都改。那我们不如用一个宏来定义:
    #define VAR_OFFSET(p) (p+2)
    以后用的地方就只写*VAR_OFFSET就可以了,以后要修改,也仅仅修改宏的定义,程序的多个调用点,自己就修改了,这就是函数宏的本意。
    它原本也不建议做复杂计算。

    像你那种,故意在函数宏的参数中,写上计算公式++a,这就太极端了,不但宏不建议这样,甚至函数调用,都不建议这样,这属于典型的一语多义,很多时候都会出bug的。

    为什么不能简单写成这样呢:
    a++;
    b+=2;
    Max(a,b);
    这不是简单明了多了吗?为什么我们要把本来简单的东西,故意弄得很复杂,然后造出一个bug来证明宏不能用呢?
    实际工程中,不会遇到你这种写法,工程型代码要求每行都很简单,一目了然,人读了不会产生歧义,计算机读了也不会产生歧义。因为下一个维护这个代码的人,很可能不是你本人了。
    感觉你这个例子是故意设计出来的一个陷阱代码,来论证你论点的正确。这个就不具备代表性了,没有说服力的。

    inline当然可以替代宏,甚至不用inline,就直接把这个计算写成函数也可以。其效果是一样的。
    不过我个人的习惯是在某些场合用宏而已。

    嗯,多说一点吧。
    上次回复,我已经说了,我不会强迫你和任何人,但是也请你不要强迫我。
    不过这次看你的提法,还有点这个意思在里面。
    作为年轻人,做事认真,遇到问题据理力争,这是好事,不过,我这里提醒一点,万事讲究一个平衡,有一个度的把握。

    在以后的社会上,企业里,你遇到的情况会很复杂。不是每个人都会很有耐心地和你争辩每一个问题。你也不太可能说服每一个人,很多时候,我们需要妥协。这是职场生存的诀窍。
    我完全没有批评你的意思,仅仅是一点善意的建议,在职场上,不要试图去改变别人的习惯,让别人按照你的意思来做事,尤其是不要试图去征服别人。这可能会引起很大的反感,甚至导致其它的一些不必要的麻烦。可能会对你以后的发展不利。

    其实像这个宏的使用习惯问题,仅仅是一个习惯,算是小问题了,并且,我用它,你不用它,都不是什么坏事,完全没有必要去争论的。

    你看这样好不好,你呢,继续坚持用inline,我呢,继续坚持用宏,咱俩互不影响,好不好?
  • 王寅(C/C++学生)
    确 实,我确实想说服你,而且如果不能说服你的话,我也想被你说服。但有一点我要说明,我绝对不以说服了谁,来表明自己怎么怎么样。我的动机很单纯,没有其他 意思。这里是论坛嘛,又不是在公司,不是在职场,争一争多有趣啊,你说是不是。再说我不认为,那个问题只是一个习惯问题,它确实有它的意义。以后有问题还 要向你请教呢。
  • 肖舸
    肖舸 现在
    王寅(C/C++学生): 确实,我确实想说服你,而且如果不能说服你的话,我也想被你说服。但有一点我要说明,我绝对不以说服了谁,来表明自己怎么怎么样。我的动机很单纯,没有其他意思。这里是论坛
    嗯,你回答了我的后半部分,没有回答前半部分。
    补充一点吧。
    我觉得生活不是PK,我们生活的世界多姿多彩,每个人的差异性正是我们这个世界的魅力所在,我比较喜欢看到别人和我不太一样,这让我有活着的真实感。
    其次,我觉得论坛是社会,公司也是社会,我们是社会人,有些时候,提早准备一点社会的知识,没有坏处。
    再就是,那个问题你认为它有它的意义,它就有意义,你坚持你的原则是没有坏处的。
    欢迎你以后多请教,我会尽量详细地解答,不过,超过我的能力了的,可能就解答不了了,呵呵。
  • 肖舸
    肖舸 53秒前
    王寅(C/C++学生): 确实,我确实想说服你,而且如果不能说服你的话,我也想被你说服。但有一点我要说明,我绝对不以说服了谁,来表明自己怎么怎么样。我的动机很单纯,没有其他意思。这里是论坛
    想了一下,我也说个理由来讨论哈。你看能同意不。
    宏很轻灵。
    不管是不是inline,它总有大括号,而在C编译器看来,遇到一个大括号,就有一个建栈的过程,后面还有拆栈的过程,而宏是编译前的纯字符拷贝,没有这一过程。
    因此,虽然inline也是代码拷贝,其成本比宏还是稍高一点点的。
    至于你说的空间增大问题,空间换时间,是工程设计中常用的手法,很多性能优化都是基于此原理在实施,因此,我不认为宏做得很过分。
  • 韩卫平(C/C++老师)<img src='/image/teacher.gif' border='0'>
    习惯而已,如果没有实在的必要,在我的代码里面是禁止出现宏的。
    理由只有一个,宏不是代码。编译器看不到宏,只有预处理能看到宏。
  • 肖舸
    回复 #2
    肖舸 17小时前
    韩卫平(C/C++老师): 习惯而已,如果没有实在的必要,在我的代码里面是禁止出现宏的。
    理由只有一个,宏不是代码。编译器看不到宏,只有预处理能看到宏。
    嗯,补充一点,宏对调试不利。
    一般单步跟踪,跟踪到函数型宏,就跟不进去了。呵呵。
  • 肖舸
    回复 #5
    肖舸 16小时前
    没事,我拷贝过来。
    回复#1 王寅(C/C++学生) 14分钟前
    我也觉得会高一点,er。。。我不了解编译器在这里会怎样处理,我猜的话,编译器为了实现函数行为,确实需要生成代码来确保,比如参数会在进入函数体之前 先被计算,然后拷贝参数,最后有返回值的话也会也可能会拷贝返回值。整个相比一般函数节省下来的应该是,call 和 return 两个指令,以及保存现场所用的压栈啦,恢复现场用的弹栈啦。或许编译器有它自己的方法,不过我也觉得inline代价会高一点,查看一下生成的汇编会比较 清楚。不过我所举的那个误用宏的例子,让我偏向用inline,他带来得好处似乎更多一点。
    那个空间增大的问题,er。。。能换来时间吗?难道读宏定义的数据会少几个指令,这个我不是很清楚。
  • 肖舸
    回复 #6
    肖舸 16小时前
    湖北工业大学 吕固(C/C++学生): 肖兄:我学C++的,对宏不了解能不说详细点,我也从来没用过宏.不知它与const的区别?编译器以VC8或gcc 4.4.3.
    没用过,就不要用了。
    inline+const能替代绝大多数用宏的场合。
    我是C出身的,所以习惯用宏,仅此而已。
  • 湖北工业大学 吕固(C/C++学生)
    正好我的观点与楼主和肖兄的都不一样,肖兄讲一下啦,C89也是C++一部分.想了解C++更全面一点,不知道它怎么样至少应该知道它的缺点及带来的坏的 影响吧.我认为 define 与 const+inline 完全不是一个东西没有可比性,你们是怎么把这两个东西放在一起的比较的?
  • 肖舸
    回复 #8
    肖舸 16小时前
    王寅(C/C++学生): 哦,帖在这里啊,没看到,不好意思。发到那边去了
    C和C++的编译器有个特点,见到大括号就建新栈。
    函数内部也可以用这个技巧来划定一个变量的作用域的,我有时候故意这么用。
    void Func(void)
    {
         //...
        {
            int i;   //看这里,这个i的作用域仅限于内部的大括号,这是个技巧,强行建新栈。出了大括号范围,新栈自动拆除,i就没有了。
        }
    }

    inline函数在编译时,由于有大括号,会有一次建栈和拆栈的过程,因此,其运行成本,其实还是相当于一正常次函数调用的百分之几十。仅仅是减少了一个call的CPU压栈行为,C部分的运行期浮动内存栈还是正常建立了的。

    不过这不重要,正常情况下,现在CPU和内存的频率都这么快,这点开销不明显。

    不过,空间换时间是很重要的技术手段,这个可是程序优化常用的,必须习惯使用。
    比如我们画一个屏幕,可以一个点一个点的计算,也可以把屏幕左边的点建立一个表,绘制时根据y坐标直接查表获得。这个在游戏编程中是经常用到的技巧,高速图形处理,很多都是用查表法。
    这个建立查询表,肯定就是用空间来换时间了。
  • 肖舸
    回复 #9
    肖舸 16小时前
    湖北工业大学 吕固(C/C++学生): 肖兄讲一下啦,C89也是C++一部分.不知道它怎么样至少应该知道它的缺点及带来的坏的影响吧.我认为 define 与 const+inline 完全不是一个东西没有可比性,你是怎么把
    看帖子咯,再找本C的书看看,就有了。
    其实很简单的。
    宏两大作用
    定义常量,C++建议用const
    定义函数型宏,固化计算,C++建议用inline函数,就是内联。
    原因是C是弱类型,C++是强类型,C++认为宏不检查变量类型,会留下bug隐患,因此建议不要使用。
    不过近年来,宏的这个特点又被看成优点了,因为不检查类型,所以才能一个定义,适应多种变量类型,实现函数式编程。这个很热门,是多任务并行开发的利器。
    只可怜C++把宏批评了半天,结果自己没办法,又搞了个泛型程序设计,又笨又重,累死不讨好。呵呵,这是开个玩笑了。
  • 王寅(C/C++学生)
    回复 #10
    王寅(C/C++学生) 16小时前
    恩,空间换时间,时间换空间,似乎整个计算机科学都渗透这条法则。
    怎么权衡那要看具体问题,具体分析了。
  • 肖舸
    回复 #11
    肖舸 16小时前
    王寅(C/C++学生): 恩,空间换时间,时间换空间,似乎整个计算机科学都渗透这条法则。
    怎么权衡那要看具体问题,具体分析了。
    好,具体情况具体分析,
    说出这句话,就是吃透了程序设计的精髓了。
  • 湖北工业大学 吕固(C/C++学生)
    肖兄:之前有贴子不是说,inline就像是register 关键字一样,不是由你决定的是由编译器决定用不用的,只是优化时的修饰用,可选的.而define 是文本替换,两者作用不一样怎么搞到一起去的. const 除了固化变量外,再就是方便编译器优化的功能.运行时常变量也不是放在只读内在中,也和变量一起放在数据区(可能正因为这样你可能通过m什么的可以改 吧.).这也与define 联系不到一起去.
  • 肖舸
    回复 #13
    肖舸 16小时前
    湖北工业大学 吕固(C/C++学生): 肖兄:之前有贴子不是说,inline就像是register 关键字一样,不是由你决定的是由编译器决定用不用的,只是优化时的修饰用,可选的.而define 是文本替换,两者作用不一
    没错,inline编译器有发言权。
    我说的是编译器和你都同意的情况下,inline才有可能对#define有替代关系。
    double check!明白吗?
    实际用起来,inline是在编译器展开代码,而#define是在预编译展开代码,仅此而已。
  • 湖北工业大学 吕固(C/C++学生)
    像 #define  BB "我是字面常量"
    按C++的理解,常量有,文字常和常变量之分,
    在程序中用BB替换后,编译器就会按字面常量处理,这样经编译器处理后,写在代码区,是不可寻址的.而用常变量,只是变量固化啦,还是个变量,它是可寻址的.不一样的东西呀.
    肖兄:你会VC,在VC8下输出汇编代码,可看出字面常量是 mov DWORD PTR _n$[ebp],8888; 是在一帧数据中,n 距 帧指针 ebp的偏移量.是硬编码. 所以,论题没有可比性.
  • 肖舸
    回复 #15
    肖舸 16小时前
    湖北工业大学 吕固(C/C++学生): 像 define  BB = "我是字面常量";
    按C++的理解,常量有,文字常和常变量之分,
    在程序中用BB替换后,编译器就会按字面常量处理,这样经编译器处理后,写在代
    1、写错了,应该是
    #define  BB "我是字面常量"  //没有=,没有分号
    2、你说不一样就不一样咯,你就不用好了。
  • 湖北工业大学 吕固(C/C++学生)
    再是,看过一些开源C代码, 一般 define 会一戳一戳的定义一些相关量,为什么不用 enum,把它们都集中一起来,这样更对象些,也系统相互性也更内距些吧.
  • 湖北工业大学 吕固(C/C++学生)
    普罗通信西安有限公司 肖舸(C/C++老师): 1、写错了,应该是
    #define  BB "我是字面常量"  //没有=,没有分号
    2、你说不一样就不一样咯,你就不用好了。
    哦,马上该.
  • 肖舸
    回复 #18
    肖舸 8小时前
    湖北工业大学 吕固(C/C++学生): 再是,看过一些开源C代码, 一般 define 会一戳一戳的定义一些相关量,为什么不用 enum,把它们都集中一起来,这样更对象些,也系统相互性也更内距些吧.
    枚举我没用过,20年了一直没用过,不知道为什么,就是不喜欢。
  • 韩卫平(C/C++老师)<img src='/image/teacher.gif' border='0'>
    如果没有用到 #和##的话。宏完全可以被替换掉。

    再说了宏要是中间结尾少写一个;啥的错误可不好查。
    不光新手老手也会犯这个错误。
  • 肖舸
    回复 #20
    肖舸 6小时前
    韩卫平(C/C++老师): 如果没有用到 #和##的话。宏完全可以被替换掉。

    再说了宏要是中间结尾少写一个;啥的错误可不好查。
    不光新手老手也会犯这个错误。
    看个人习惯吧。
    我个人比较喜欢用宏。
    太绝对的论证一个东西好还是不好,总不是太好的事情,因为未来的需求和方向我们预测不准,走起来看吧。
  • 韩卫平(C/C++老师)<img src='/image/teacher.gif' border='0'>
    普罗通信西安有限公司 肖舸(C/C++老师): 看个人习惯吧。
    我个人比较喜欢用宏。
    太绝对的论证一个东西好还是不好,总不是太好的事情,因为未来的需求和方向我们预测不准,走起来看吧。
    是啊,宏优缺点都有。

    MFC中大片的宏,完成了本该编译器做的事情,也完成了消息链这种复杂的过程。设计的巧妙让人惊叹啊。
    同时也放倒了一批研究MFC原理的人。
  • 肖舸
    回复 #22
    肖舸 6小时前
    韩卫平(C/C++老师): 是啊,宏优缺点都有。

    MFC中大片的宏,完成了本该编译器做的事情,也完成了消息链这种复杂的过程。设计的巧妙让人惊叹啊。同时也放倒了一批研究MFC原理的人。
    有本书你看过没?
    如果用汇编语言开发Windows程序。
    里面更昏,全部是宏,写到后面,基本上见不到汇编了。
    我用宏的习惯,其实是以前用汇编做游戏养成的。
    一个游戏15万行代码,如果不用宏,快80万行了。敲都敲死人。
    写到最后,你在我的汇编中,可以看到FOR,NEXT,PRINT这些语句的,全部是宏。呵呵。
  • 肖舸
    回复 #24
    肖舸 6小时前
    湖北工业大学 吕固(C/C++学生): 那linux源代码中宏多不多呀,占 ?%呀?
    唉,有一群顽固的老C程序员在做中流砥柱,想用现代的纯C++做系统都不行呀。
    呵呵,那是因为C++离了C做不了事情的。
    C++是C的面相对象解释。
    在函数内部,还是C的写法多,呵呵。
    我是愉快的C,我看着C++,就是不说话,哈哈。
  • 湖北工业大学 吕固(C/C++学生)
    不是有数据集的类模板,和建立算法库的函数模板。
    数据(静的),操作(动的)都有了。
    老顽固就是不用呀,浪费了编译器厂家精心写的标准库.
  • 韩卫平(C/C++老师)<img src='/image/teacher.gif' border='0'>
    这倒没看过
    不过我还是习惯用模板啥的C++提供的功能来写代码,好调试,容易维护。也不会有多少重复的代码。
  • 武汉科技大学 赵孜泷(Java学生)
    LS的都是牛人.
    我果断的采取观望态度.达到楼上诸位的实力
    1.大量编程.
    2.研究编译原理与编译器.
    3.懂汇编.
    4.优化代码
    5.了解计算机思想.那一个资源换一种资源
    抽象出物理学:
    热力学第一定律:能量既不可能再生也不可能消灭只是一种形式转化为另一种形式.
    热力学第二定律:墒是不断增加的.
  • 湖北工业大学 吕固(C/C++学生)
    对了,好像也没见用 MMX/SSE 写程序的,浪费了那些指令集啦。对了肖兄,近期一直不解,现在许多显卡的gpu的浮点计算速度已经远超intel cpu浮点计算速度的20-30倍了,能不能把计算量从CPU放到gpu上去,不然白白浪费了强大gpu啦。
韩卫平(C/C++老师)<img src='/image/teacher.gif' border='0'>
湖北工业大学 吕固(C/C++学生): 对了,好像也没见用 MMX/SSE 写程序的,浪费了那些指令集啦。对了肖兄,近期一直不解,现在许多显卡的gpu的浮点计算速度已经远超intel cpu浮点计算速度的20-30倍了,能不能
你用DX呗
山顶洞人 陈聪贤(Net爱好者)
围观的路过,C/C++ 真是博大精深啊!
  • 肖舸
    回复 #32
    肖舸 6小时前
    湖北工业大学 吕固(C/C++学生): 对了,好像也没见用 MMX/SSE 写程序的,浪费了那些指令集啦。对了肖兄,近期一直不解,现在许多显卡的gpu的浮点计算速度已经远超intel cpu浮点计算速度的20-30倍了,能不能
    CUDA就是干这个的。
    我也在研究。
    不过近期遇到一点困难。
    CUDA下直接操作GPU多个计算核心没问题,并发线程也没有问题。
    最大的问题是GPU处于显卡上,对内存总线的操作能力很弱,且和系统内存不是连续编址,因此,稍微数据量一大的工作,光是把数据传送到显卡的存储区,供GPU计算,这个loading就很大。有时候甚至得不偿失。
    我估计,如果要真正利用好CUDA,必须解决GPU计算的数据提供,如果能让GPU直接看见主内存空间就好了,否则无法实用。
    又或者,对于简单业务的服务器,每个单一客户服务,数据量都很小,传输成本不高,可以考虑用CUDA模型。
  • 山顶洞人 陈聪贤(Net爱好者)
    湖北工业大学 吕固(C/C++学生): 对了,好像也没见用 MMX/SSE 写程序的,浪费了那些指令集啦。对了肖兄,近期一直不解,现在许多显卡的gpu的浮点计算速度已经远超intel cpu浮点计算速度的20-30倍了,能不能
    GPU 编程去这个网站貌似不错呢
    http://www.gpgpu.org/developer/index.shtml

    不好意思跑题了
  • 湖北工业大学 吕固(C/C++学生)
    普罗通信西安有限公司 肖舸(C/C++老师)<img src='/image/teacher.gif' border='0'>: CUDA就是干这个的。
    我也在研究。
    不过近期遇到一点困难。
    CUDA下直接操作GPU多个计算核心没问题,并发线程也没有问题。
    最大的问题是GPU处于显卡上,对内存总线的操
    那能不能用CPU上的运行TBB下处理,从主程序到CUDA的核程序就用TBB的调度器来导入到 CUDA的核程序中?
  • 肖舸
    回复 #35
    肖舸 5小时前
    湖北工业大学 吕固(C/C++学生): 那能不能用CPU上的运行TBB下处理,从主程序到CUDA的核程序就用TBB的调度器来导入到 CUDA的核程序中?
    TBB是what?
  • 湖北工业大学 吕固(C/C++学生)
    普罗通信西安有限公司 肖舸(C/C++老师)<img src='/image/teacher.gif' border='0'>: TBB是what?
    就是 threading building blocking,更好的多线程库,你可以把它当成并行的STL;
    以前你用的openMP,MPI,...都是裸线程库相当于用汇编语言写并行程序,
    现在你用TBB好了,它抽像高了相当于用C++写并行程序啦。它的把任务映射各操作系统的线程,但它不像boost.thread那样只是个线程包皮。 Cpu这边都是小任务集,GPU那边都是矩阵块中的线程集。M:M。世界是并行的恩。世界由对象组成,按并行方式运行。
  • 肖舸
    回复 #37
    肖舸 5小时前
    湖北工业大学 吕固(C/C++学生): 就是 threading building blocking,更好的多线程库,你可以把它当成并行的STL;
    以前你用的openMP,MPI,...都是裸线程库相当于用汇编语言写并行程序,
    现在你用TBB好了,
    没用过。
    我的线程池是自己写的,已经在n个商用工程中实践过,非常稳定。
    内存池也是自己写的。
    不太喜欢用这种别人开发的库,因为我不知道它是不是经过了我这么严格的测试环境,并且有长期的公网运营经验。

    你说的这个不成立。
    就算有库,你去想想,库底下在做什么?是不是还是要做把数据传输到显卡的动作,才能利用GPU的计算?不管啥库,没有数据,计算总不可能进行吧。
    因此,你说用库来解决,不是好办法,仅仅是把自己做的事情,委托一个不熟悉的人来做,但这个事情还是要做的。
    这好比把眼睛蒙上过马路,说马路上没有车子,因为你看不见,完全是自欺欺人的做法。

    你如果出于学习目的,建议自己来实现一下看看,不要上来就用库。
  • 湖北工业大学 吕固(C/C++学生)
    普罗通信西安有限公司 肖舸(C/C++老师): 没用过。
    我的线程池是自己写的,已经在n个商用工程中实践过,非常稳定。
    内存池也是自己写的。
    不太喜欢用这种别人开发的库,因为我不知道它是不是经过了我这么严格的
    用TBB试过但简单的程序控制台的看不出什么效果。
  • 肖舸
    回复 #40
    肖舸 4小时前
    湖北工业大学 吕固(C/C++学生): 用TBB试过但简单的程序控制台的看不出什么效果。
    并行程序是大型计算,一般实验室很难模拟那么大的数据规模,也就很难做性能测试。
    你看不到是正常的,主要是实验的模型数据太小,太少。
  • 肖舸
    回复 #42
    肖舸 3小时前
    湖北工业大学 吕固(C/C++学生): 但是现在都是多核CPU,而且还在不断增加。
    前几天CSDN也有说:
    http://news.csdn.net/a/20090519/211371.html
    要与时俱进呀,不想总落在后面。肖兄,侯捷不是说过,现在就
    我没有说不接受啊,我正在研究的也是分布式并行计算。
    你认为我哪点没有接受?
肖舸
回复 #43
肖舸 3小时前
湖北工业大学 吕固(C/C++学生): 但是现在都是多核CPU,而且还在不断增加。
前几天CSDN也有说:
http://news.csdn.net/a/20090519/211371.html
要与时俱进呀,不想总落在后面。肖兄,侯捷不是说过,现在就
奇怪,多任务处理,并行计算,分布式计算,我研究差不多快10年了,你咋会认为我落在后面了呢?
10年前你在做什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值