4

以下代码是我计算 pi = 3.1415... 的代码,大约使用这个公式:

use Time;
var timer = new Timer();

config const n = 10**9;
var x = 0.0, s = 0.0;

// timer.start();                                     // [1]_____

for k in 0 .. n {
    s = ( if k % 2 == 0 then 1.0 else -1.0 );  // (-1)^k
    x += s / ( 2.0 * k + 1.0 );
}

// timer.stop();                                      // [2]_____
// writeln( "time = ", timer.elapsed() );             // [3]_____

   writef( "pi (approx) = %30.20dr\n", x * 4 );
// writef( "pi (exact)  = %30.20dr\n", pi );          // [4]_____

当上面的代码编译为chpl --fast test.chpl并执行为time ./a.out时,它会以~4 秒的形式运行

pi (approx) =         3.14159265458805059268

real    0m4.334s
user    0m4.333s
sys     0m0.006s

另一方面,如果我取消注释 Lines [1--3]( to use Timer),程序运行速度要慢得多,大约10 秒

time = 10.2284
pi (approx) =         3.14159265458805059268

real    0m10.238s
user    0m10.219s
sys     0m0.018s

[4]当我只取消注释 Line (打印 pi 的内置值,Lines[1-3]保持注释掉)时,也会出现同样的减速:

pi (approx) =         3.14159265458805059268
pi (exact)  =         3.14159265358979311600

real    0m10.144s
user    0m10.141s
sys     0m0.009s

所以我想知道为什么会出现这种减速...

我是否遗漏了上述代码中的某些内容(例如,错误使用Timer)?

我的环境是通过自制软件安装的 OSX10.11 + chapel-1.16。更多详情如下:

$ printchplenv --anonymize
CHPL_TARGET_PLATFORM: darwin
CHPL_TARGET_COMPILER: clang
CHPL_TARGET_ARCH: native
CHPL_LOCALE_MODEL: flat
CHPL_COMM: none
CHPL_TASKS: qthreads
CHPL_LAUNCHER: none
CHPL_TIMERS: generic
CHPL_UNWIND: none
CHPL_MEM: jemalloc
CHPL_MAKE: make
CHPL_ATOMICS: intrinsics
CHPL_GMP: gmp
CHPL_HWLOC: hwloc
CHPL_REGEXP: re2
CHPL_WIDE_POINTERS: struct
CHPL_AUX_FILESYS: none

$ clang --version
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

更新

按照这些建议,我按照这个这个页面并添加CHPL_TARGET_COMPILER=gnu~/.chplconfig(在运行之前make)从源代码安装了 Chapel。然后,上述所有三个案例都运行了约 4 秒。因此,问题可能与 OSX10.11 上的 clang 有关。根据评论,较新的 OSX (>= 10.12) 没有此问题,因此升级到较新的 OSX/clang (>= 9.0) 可能就足够了。仅供参考,更新的环境信息(使用 GNU)如下:

$ printchplenv --anonymize
CHPL_TARGET_PLATFORM: darwin
CHPL_TARGET_COMPILER: gnu +
CHPL_TARGET_ARCH: native
CHPL_LOCALE_MODEL: flat
CHPL_COMM: none
CHPL_TASKS: qthreads
CHPL_LAUNCHER: none
CHPL_TIMERS: generic
CHPL_UNWIND: none
CHPL_MEM: jemalloc
CHPL_MAKE: make
CHPL_ATOMICS: intrinsics
CHPL_GMP: none
CHPL_HWLOC: hwloc
CHPL_REGEXP: none
CHPL_WIDE_POINTERS: struct
CHPL_AUX_FILESYS: none
4

2 回答 2

4

我是否遗漏了上述代码中的某些内容(例如,错误地使用了 Timer)?

不,您没有遗漏任何东西,并且Timer以完全合理的方式使用(和 Chapel)。根据我自己的实验(证实了您的实验,并在您的问题下的评论中注明),这看起来是后端编译器问题,而不是 Chapel 或您使用它的基本问题。

于 2017-11-29T22:47:25.027 回答
1

[--fast]减少运行时检查,但问题可能不会在这里重新运行

还请注意,设置/操作附加开销有多大
,仅为教育目的
(试验并发处理)而引入,这使得forall-constructor 配备Atomics .add()方法,产生的开销比并发的要高得多-处理允许增益,因为[PAR]在进程的启用部分内有如此微小的计算(参考 新重新制定的阿姆达尔定律关于这些太薄[PAR]的 - 增益v / s确实太高的附加开销到[SEQ]-costs ) .

一个典型的消息。

use Time;
var timer = new Timer();

config const n = 10**9;
         var s = 0.0, x = 0.0;
         var AtomiX: atomic real;                           // [AtomiX]______
             AtomiX.write( 0.0 );                           // [AtomiX]______

timer.start();                                              // [1]_____

for k in 0 .. n {
    s  = ( if k % 2 == 0 then 1.0 else -1.0 );     // (-1)^k
    x += s / ( 2.0 * k + 1.0 );
}

/* forall k in 0..n { AtomiX.add( ( if k % 2 == 0 then 1.0 else -1.0 )
                                / ( 2.0 * k + 1.0 )
                                  ); } */                   // [AtomiX]______

timer.stop();                                               // [2]_____
writeln( "time = ", timer.elapsed() );                      // [3]_____

   writef( "pi (approx) = %30.20dr\n", 4 * x );    
// writef( "pi (approx) = %30.20dr\n", 4 * AtimiX.read() ); // [AtomiX]______
// writef( "pi (exact)  = %30.20dr\n", pi );                // [4]_____

/*
--------------------------------------------------- [--fast] // AN EMPTY RUN
time = 1e-06

Real time:  9.582 s
User time:  8.479 s
Sys. time:  0.591 s
CPU share: 94.65 %
Exit code: 0
--------------------------------------------------- [--fast] // all commented

pi (approx) =         3.14159265458805059268

Real time: 15.553 s
User time: 13.484 s ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~> Timer ~ +/- 1 second ( O/S noise )
Sys. time:  0.985 s
CPU share: 93.03 %
Exit code: 0
-------------------------------------------------- [--fast ] // Timer-un-commented
time = 5.30128
time = 5.3329
pi (approx) =         3.14159265458805059268

Real time: 14.356 s
User time: 13.047 s ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< Timer ~ +/- 1 second ( O/S noise )
Sys. time:  0.585 s
CPU share: 94.95 %
Exit code: 0

Real time: 16.804 s
User time: 14.853 s
Sys. time:  0.925 s
CPU share: 93.89 %
Exit code: 0

-------------------------------------------------- [--fast] // Timer-un-commented + forall + Atomics

time = 14.7406
pi (approx) =         3.14159265458805680993

Real time: 28.099 s
User time: 26.246 s
Sys. time: 0.914 s
CPU share: 96.65 %
Exit code: 0
*/
于 2017-11-29T21:40:19.180 回答