设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 5030|回复: 25
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ! q" y) B0 Y7 J1 A: ?7 B2 m" O& Z5 R5 D: I
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。+ z2 c' w! N7 O+ o  h; j- ]

    6 f% P; j/ H, q* b+ _4 a# n速度优化问题真的很有意思啊。# K! T# {8 B: V( P8 r

    : X/ |( V. i3 f4 u! W& ?) K( Y$ U欢迎大家继续讨论

    评分

    参与人数 2爱元 +8 收起 理由
    helloworld + 4
    住在乡下 + 4 涨姿势

    查看全部评分

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1885 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?7 s2 A6 J# N4 z5 Q# A) c
    把代码贴上来看看?
    + E5 G) l6 C  L( A$ r( a4 {% L$ X
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    ! G0 X( H2 r7 q( Z2 A- v% s$ |
    数值分析 发表于 2022-9-24 23:045 Q! Y, r" @/ _) `, B" T  N( A
    拉下来?拉多少?
    " ^6 |& j) m, Q3 E/ L& s# Q把代码贴上来看看?

    - @& m: ~# E5 w2 ?6 {
    - g/ Q" `/ F, Evoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  S+ M# Q+ {7 g" t
    {
    4 i+ s0 i- V$ l7 V2 c        comp temp, xtimesy;
    4 O+ d$ p9 x+ ]% ?. {: q* o* r  V        xtimesy.re = 0;
    . m. b7 F; X' `0 A7 h/ m        xtimesy.im = 0;7 @( V& Q, z, J
            int j0 = lenB - 1;
    # E2 g. W6 [) Y        int    i, j, i1, reali;& q" J# u) D0 [8 c8 o
            if (lenA % 2 == 1)# A3 Z, k( Z8 e. M$ X6 Y# e- I3 D2 W
                    reali = lenA + 1;* }' \+ ~* N- g5 V8 w9 u- D% J
            else
    ' I8 x$ o, i0 y) u6 u0 g% H4 c                reali = lenA;
    - j, m( o' E- y! q# w7 r' g        reali /= 2;& B4 c& f' ~: v$ l
    . ]+ d) M6 b0 p/ S& {3 K! C/ A: R
            int nconv = reali + lenB;
    . d8 ?  p- |4 ]) O0 W( C- q$ v. b        //#pragma omp parallel for/ P2 X2 q1 u7 B8 l8 K/ K7 f
            for (i = reali; i < nconv; i++)- m4 p4 V- z' f' M: Y
            {2 P; |4 ?0 b0 J) c! d# u7 b
                    temp.re = 0;
    : V/ X' x( y) {# N* D: d# ^: Z                temp.im = 0;
    0 y0 a! b( E1 ~/ r& x2 H/ g                i1 = i;" L" C5 z5 Z8 b2 Y  P, t0 S7 U
                    for (j = j0; j >= 0; j--)
    4 }; h6 j' w9 p4 H: q                {: f' [5 I2 k! W8 {
                            /* floating date operation */, q1 i" T3 k; K
                    }
    7 G8 r8 s, g! }' y8 Z  z/ o
            }% Q$ |2 w4 `) b' S
    }
    7 ^1 G' d. ?7 Q! ~/ b: C( i/ n! k, v1 r
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ! L0 ^$ }2 `" l4 {# v% ^' J: q  h0 W7 ]7 n7 R
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。4 H6 _  F2 @9 ?- b5 B
    现在call xcorr 100次,耗时78s.
    & X) A% q9 v+ J3 g, ]* W; o3 k; D6 x; q- }
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 0 [: g' }+ J7 x6 g. T6 y

    ) v- d+ i' g6 y: y; A! J) a% I% h
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33* }: _( K/ @; y3 V6 v  O
    Maybe Debug mode?
    & c5 R( i( R; i# j) |% ~6 F: `7 K

    7 N* `. b( y% z7 j, X; J- q不应该,看我上面的回复。
    $ N# ^0 T1 m$ d/ ?# _2 w( L# |
    1 _/ C/ h6 ~- N% w% _5 f' K  Y我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1885 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 * c6 T# z' ]" b3 P# F0 f2 U6 z
    雷达 发表于 2022-9-24 23:54; u/ M7 Q3 G6 |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ E- c- H' `" V" @$ D8 f{& d. F9 r+ u/ i* x- m
            comp temp, xtimesy;
    ; A! w5 g+ @6 E& {1 A

    0 d9 p" g8 o/ W" P这个不是这么比的吧。。。
    ; S! i4 `7 N- ?/ H& r
    9 j7 N" f4 h; ^, m# G: Z; g您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。  @3 B0 `9 j1 I8 u$ R8 ?; l" n$ V
    $ S$ P: q9 r6 F
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    6 }! e- H  h1 [
    数值分析 发表于 2022-9-25 00:20
    ' _) V- S1 j! ?& K( I( z这个不是这么比的吧。。。
    ! j( x# G7 p1 A7 j
    7 ?9 }( C1 L0 E; Y& q9 ^您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    9 S; x2 @* }' n, j0 M5 \
    ! k' E& n5 |7 w/ W# ?/ }
    有道理。
    / A% ?0 R1 g: C! z* V+ V; |) @所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    4 a% d+ y  }6 c5 e4 k; D4 w; G7 ~. H$ r6 f% }2 Z9 ?
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    # D! {* l! p& W0 J! _有道理。
    2 \: @  w# ]0 [( C所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 H  y( Y0 s. |. {& C9 _  z- \6 M你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    4 U) n% q. Y9 [9 R0 w9 bWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20; X! c; Z/ i. }" G1 b" f% ~: s+ N
    这个不是这么比的吧。。。& J0 f) |# e1 c5 b* M
    ! Q. N7 T  r, Z- D7 @) R- {3 `4 E
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ; g- \$ F9 L& G4 W

    $ V! j  M2 Q# F8 [现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1885 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    ) _- M$ i; L& N6 q! d2 i, `. j
    沉宝 发表于 2022-9-25 01:48. v3 H2 ^. f; ^4 R6 Y  Z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    % r3 D5 F/ a) \, h/ Z  X) r+ J, M2 E9 m1 n7 R
    是的,兄台说的对。+ b! }6 ^' j& D3 j" a

    * ?$ @' x' ?3 K( O$ G其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ) u9 X" d' W3 g
    5 p, L+ R, G1 ^0 ^9 W+ k5 Z2 }雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    & [7 r3 I$ y7 b1 r$ J- F# {" r8 P2 a  O2 R5 [
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    : T$ h, u0 k, ~
    ; x. [0 S5 m* k' Q" M! {, b当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    3 z7 G- L; F: p7 \& [, |1 A; b- L! D
    沉宝 发表于 2022-9-25 01:27
    3 ^; k8 `; \* l, o5 N  ^你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    . C; m( C- Z9 J$ N
    ( X& V5 n2 o4 q' A
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。- O% y* N; J; Y* d

    ! S! z! k$ U# s9 q1 @3 k- E/ R5 s我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:470 z2 ]0 e) Y3 u. D' h5 M( a9 G
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    , U# }$ E: ?/ y/ ]时间差一倍的结果可以接受。( |# O3 V# d0 b/ @/ `
    ! v* Y9 y3 e* H1 ?* l$ R  e0 h8 X) o
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1885 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 $ ~+ v/ _- F! y$ @& W
    雷达 发表于 2022-9-25 04:47
    . I/ U% t  i5 S2 ]又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    0 i3 p6 l2 A* t/ Y5 H. \% b6 Y

    , {  o$ N6 I: [6 V0 X; W3 f3 S& S, |7 R* ]# ^" K- |' \5 r3 T

    & U! [$ Y* a( ?# V" S& ?7 @能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 - m8 K. `7 z  q$ ~. [
    数值分析 发表于 2022-9-25 14:585 k$ e6 e0 _6 ^, N$ P6 x/ M6 z
    能不能把这个也贴上来,看看和上一个有什么不同?

    5 u! n0 A+ r3 {& j5 w! j2 {理了理思路,重新做了一个测试。# T# K5 i! B# n* p6 D! n
    做了两个 vector 和 两个 float *, 都长 100000% i% w/ V/ ?; H$ R0 f2 Z3 {; P
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    & I+ a3 u" d7 M* R  b
    * [4 {! b( b" d: `5 g内循环试了4种方法,! w3 x7 g6 z- N2 C' V! i+ h
    1. 直接调用 vector inner_product 247s
    6 B2 b$ [3 M6 d; |+ ~2. vector 循环点乘累加 237s
    / J  y/ K# P6 r# Q1 w  @! u( ?9 Z3. float * 循环点乘累加 204s
    1 ^) r: Z5 J1 Y( \) s# _4. 空循环 100000 次 202s1 o5 ]6 O7 p6 k5 o% C7 c5 c

    0 v5 ^/ _' P4 h$ h不做内循环 200s% L; r- Q/ u) d$ H5 l% H' X" V/ o3 [0 ~
    / K% S6 E" g% }. r
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 q) U! u1 j7 j: j
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。1 S, N: D* Y4 k  K2 h& l

    $ y/ b1 N9 z- H, m- i& I7 v至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    + [* Z; {3 t& k1 T- i% G* f+ n1 ~- O5 q
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)$ O: E/ h" n& z& Q- N

    8 a! N+ O2 ?+ ~2 s
            std::vector < float > vec1(N);
    4 N; ]& z1 \  F: j3 A$ e+ O7 x  u/ ?. y. G        std::vector < float > vec2(N);8 A; t# J( `, }$ m! N- [0 @& l
            float* b1 = new float[N];+ d9 P! N- l' H5 ~8 U$ Z! Y
            float* b2 = new float[N];% A8 D, a) j0 R% A

    ( g6 F& f) |$ ~& C        for (int j = 0; j < 6000; j++)
    : M( @: `' j3 ^/ O) l$ W        {9 V, X/ Q7 e, R9 q9 h( x) y2 S
                    std::generate(vec1.begin(), vec1.end(), []() {
    , i: g9 w$ J0 R) s+ v- @                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    # e! G' R% ?: H" }  y  S                        });6 C( Q$ G$ Y( C1 |; y% t
    % a3 _. B' C% J1 A9 N4 P3 U
                    std::generate(vec2.begin(), vec2.end(), []() {' \# c* c$ G0 w( m
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 R# c6 I: `0 ~) s2 a3 K
                            });
    % P& @9 u- B: o9 n6 A
    $ E- ~) B- r2 {1 B& c                for (size_t jj = 0; jj < vec1.size(); jj++)
    2 [. w+ {! _7 q0 ~$ Z                {
    ' |; a1 f9 c- m) a$ X6 r                        b1[jj] = vec1[jj];3 Y% Y$ |' v* O7 @* I% A
                    }* {: z( k2 y( v  y5 D- q
    3 m# \& c' |; W+ }7 U% C9 i5 c
                    for (size_t jj = 0; jj < vec2.size(); jj++)* b) ~9 f5 U2 ~4 T1 t, n
                    {
    $ B& G% l) a4 f8 G* {7 W! v                        b2[jj] = vec2[jj];' p, [7 J( P/ ~. V
                    }- C% l6 T& C4 b9 _. s# W( o
    6 M  v4 T% W  ?9 y
                    //Method - 1  N=100000 247s  1 _) ]/ B6 w9 v! G0 `$ X1 n
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ' ]& O7 f% c7 f                                ! X4 q3 S4 ?; _9 ^' V& @' k  h. O
                    //Method - 2  N=100000  237s1 j7 r- C* u( q8 Q1 ]1 P
                    /*
      |0 a1 C9 F7 t2 _- F8 l. R                for (int jj = 0; jj < N ; jj++)
    / M3 D* m+ e2 c. C8 w' W" p                {8 y, `4 \/ K$ V4 }/ g. C
                            fresult += vec1[jj] * vec2[jj];! q( P' i: ]. Q
                    }
    & |5 k1 l: M4 ?, P2 w                */
    5 R$ W( `4 i& B: K3 G( Q! ?                                - `) n; B; T. m: c0 s: V
                    //Method - 3  N=100000 204s6 Y7 g/ F5 o) K* P: W5 N2 C! E
                    /*
    : y" D9 A0 ^9 @                for (int jj = 0; jj < N; jj++)
    ! {1 y' X/ D% ?) R! A" [! H$ I+ `                {0 k. \1 R6 s0 ~+ r  P: D" D+ n7 h
                            fresult += b1[jj] * b2[jj];
    0 ~; B( I) j% q' }. W- \( i                }8 y/ s, e) S& c/ |, N7 ]
                    */7 B5 D' I$ ]! e; u- p) H( }0 C
    * t1 p1 S9 H  c) {& W5 s% Y0 B
                    //Method - 4   202s
      _. K( W2 v/ T% r( V                /*- i5 g- H" X0 p1 X- T6 n% k! a# }
                    for (int jj = 0; jj < N; jj++)
    5 o# L3 k" {6 F9 L2 P/ S! U                {  X1 M9 E- K1 |( \  p. h3 k
                            
    # o  i: _( o; o3 a; J                }
    & d% k  A; w' I8 F* g$ a9 w0 U                */; v# o, Q) s% ^# [/ T8 @. J/ ~6 ?
                    //comment out all methods, N=100000  202s               
    1 ]9 K8 z2 z% |; F' K        }5 I' x  D& j: t
    4 V9 |/ U- J8 Z+ `+ X& q
            delete []b1;0 I$ T/ Q4 T% q. U9 M$ }2 ^
            delete []b2;
    ; O( A4 m0 c( S
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 ~" t, f5 B2 I) T7 ?6 u* W

    4 }6 n: V- G! J7 o( y0 z你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?. M9 i8 K) L6 ?2 ~6 h4 j/ [
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ( D- D5 X6 b" K. s$ t& K+ A* N& r瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    % V5 u! p% J+ E
    " q3 }8 l) B# `! j你第二个试验里面的j在循环里面又重新定义 ...

    , H! R4 _7 N1 R1 _内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 K) z6 r) z- P# |) F6 m

    8 ]( y% @( x0 S% @3 d5 ~5 F: t不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
      T! l/ U6 j, I# h3 k* R内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    / S* J" W( F" d7 a
    8 k! {1 v5 o# N不和它 ...

    # [0 Z* d7 I) ?( S9 R, W; N5 H1 B8 ]+ G! J' j  C
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ) N2 @. Y9 _/ ^; Q1 Q后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2022-9-27 07:25:57 | 只看该作者
    一个无关问题,为什么爱坛的帖子里在我这里有好些奇怪的东东在里面,是防拷贝措施吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54# I! j2 q5 H$ x( l& D4 K  \7 Q. b
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* ]3 @, m5 B6 i+ z$ s
    {
    " m* N# Z5 F& D7 F3 f" n        comp temp, xtimesy;
    ( G: [5 `2 ]! B2 Q
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    7 A9 f! _+ T3 u6 u+ F内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?7 W* L$ |/ E, u0 |
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-5-12 13:09 , Processed in 0.047804 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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