设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
12
返回列表 发新帖
楼主: 雷达
打印 上一主题 下一主题

[信息技术] C++ 提速的新发现

[复制链接]

该用户从未签到

21#
发表于 2022-9-27 20:39:22 | 只看该作者
雷达 发表于 2022-9-26 01:30
6 j2 S1 Q+ q5 H$ |4 F理了理思路,重新做了一个测试。8 R1 M- B1 d/ T2 O& y3 \
做了两个 vector 和 两个 float *, 都长 1000005 i- ]4 q0 i# y% u# u
外循环 6000,里面先做随 ...
" h: s! M4 `' y# a
这个时间是从哪里开始算的?
/ b8 k% ^! E* n1 I我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, 用了vector那个因为有vector的额外开销,多了几十秒。2 d. ~5 Z% T  {9 n( H
按照两个10万个数字的相关计算的规模来估计的话,两秒都算很长很长了。这个结果真的很奇怪。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    22#
     楼主| 发表于 2022-9-27 22:41:56 | 只看该作者
    雷声 发表于 2022-9-27 20:39
    ( w+ d% R5 T% x3 U8 u8 P8 N* ~" c这个时间是从哪里开始算的?1 D# G+ |6 I: M# [
    我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, ...

    * R2 X  X# E0 P" a我不管它了,回头 linux 下换g++重新编译,顺便加上你们建议的向量化。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 1578 天

    [LV.Master]无

    23#
    发表于 2022-9-28 00:12:35 | 只看该作者
    你这个循环主要的计算时间是那个rand,这个循环本身占用时间微乎其微。
    0 }$ U3 ]- d! n# {" m你的空循环,如果是现在的代码,编译器很可能完全不生成对应代码,因为没有任何输出或者修改变量,所以可以看到时间都是202S。你可以认为啥都不干的时间就是那么多。
    / u$ c5 V8 Y( g0 y与此对应用数组(指针)花了2S, f0 W# e5 M* x8 T8 ^, q0 [
    你用vec1[jj]*vec2[jj]理论上不应该差30多秒,这里很可能是你对vector的操作带来了内存操作,你可以试试把初始化挪出循环然后再比较,理论上vector的随机访问和数组应该几乎没什么区别。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24#
    发表于 2022-9-28 00:29:10 | 只看该作者
    雷达 发表于 2022-9-24 23:54- B3 `9 {9 n% _& }5 n
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 y' d7 e0 B: T) e' g% K6 R+ [{' n7 c5 G) O8 L1 l* |! q  e# ~
            comp temp, xtimesy;
    2 P0 b6 |8 n6 y
    我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗  n$ o% X( e2 ]# o$ C5 P! U# w
    , \, r/ [- D% y3 k
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    25#
     楼主| 发表于 2022-9-28 00:49:59 | 只看该作者
    opensrc 发表于 2022-9-28 00:29
    ! l* }: f4 `4 \* k我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗3 h9 b1 K- g/ y1 R% q0 `  r3 a
    1 ^, }# v. A) C. w
    ...
    8 [/ B! e+ {! g+ h/ Z2 X6 O- ^. I
    你是对的,是我搞错了。确实没有优化的情况下,空循环如果次数够长本来就应该耗时较大。我搞错的原因是在不自觉得与 octave 比较,而实际上 octave 是优化过的,和是不是空循环没关系,这种不同条件的比较是没意义的。
    3 w6 ~" [- Y! d2 @8 l5 \- D, ?4 ~& \2 J
    雷声网友说的也对,空循环应该被编译器优化掉,我的编译器设置有问题。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    26#
     楼主| 发表于 2022-9-28 00:56:28 | 只看该作者
    本帖最后由 雷达 于 2022-9-28 01:09 编辑
    4 j# A; M9 z' v+ ]& a+ V; b( R& O) ]7 @2 k7 H& f$ J* F" m
    是我自己的理解有误,没有优化的情况下,空循环如果次数够长本来就应该耗时较大。% I6 t4 H# P4 u2 d; R
    有空时我会试试 SIMD和并行,看看能提高多少。# Q7 M) @+ S# |) \  X+ G
    过去7、8 年没有正经用C++ 写过东西,没有 sense 了
    % O9 F% W+ h3 X& V谢谢大家的讨论,I learded a lot.  红包已发  
    1 x4 T& I2 M6 {/ }- t4 X) s% E; Y5 q! R
    . r, z5 F. _  M# C+ h2 z# Y$ w

    ; Q) q, P, E* c# G/ d$ E' C7 i/ ]$ V- m% _
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2025-1-28 10:31 , Processed in 0.042422 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表