【发布时间】:2017-11-29 21:03:36
【问题描述】:
以下代码是我计算 pi = 3.1415 的代码...大约使用this 公式:
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] (以使用 Timer ),程序运行速度会慢得多 ~10 秒
time = 10.2284
pi (approx) = 3.14159265458805059268
real 0m10.238s
user 0m10.219s
sys 0m0.018s
当我只取消注释 Line [4](打印 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
更新
按照建议,我通过关注this 和this 页面并将CHPL_TARGET_COMPILER=gnu 添加到~/.chplconfig(在运行make 之前)从源代码安装了Chapel。然后,上述所有三个案例都运行了约 4 秒。因此,问题可能与 OSX10.11 上的 clang 有关。根据 cmets,较新的 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
【问题讨论】:
-
您确定在所有情况下都使用了 --fast 吗?在您描述的所有 3 种情况下,我始终得到大约 4 秒,但如果我离开 --fast 则为 11 秒。
-
是的,我刚刚用 --fast 选项重新尝试了所有三种情况,但它可以在我的 mac 上重现(顺便说一下,我在问题中使用了 -o a.out,但是这不影响结果)。如果这在其他环境中无法重现,可能是由于我自己的环境...
-
我似乎在我的 Mac 上看到了类似于这个问题所报告的减速(尽管幅度略有不同)。但是,没有关于原因的理论。未注释的行应该会增加一些开销,但我不希望它们增加秒数/将执行时间加倍。
-
如果我将 CHPL_TARGET_COMPILER 从“clang”切换到“gnu”,差异就会消失。我怀疑在 clang 编译级别发生了一些有趣的事情......
-
当我试图重现这个时,我使用的是 OSX 10.12 和 clang 9.0。看起来clang版本差异解释了它。
标签: chapel