以下代码是我计算 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