【发布时间】:2013-05-08 11:39:58
【问题描述】:
我正在尝试比较 Blitz++ / Armadillo / Eigen 和我自己的库的性能。
我目前正在使用 Blitz++ 执行以下操作:
...
Array<T, 1> s(samples);
Uniform<T> rand;
rand.seed((unsigned int)time(0));
for(size_t i=0; i<samples; i++) {
s = rand.random() *4.0 +58.0;
}
...
公平地说,我需要知道用随机数填充数组的正确“Blitz++”方式。 我认为上面的 code-sn-p 不是这样做的方法,因为它的效率非常低。
简而言之
在使用 Blitz++ 时,上述 sn-p 是用随机数初始化数组的正确方法还是有更好/更有效的方法?
【问题讨论】:
-
请记住,通过这些类型的比较,您最终可能会将苹果与橙子进行比较。例如,Armadillo 中有几种accessing elements 的方式:operator()、operator[]、iterators 或 mempr()。默认情况下,operator() 启用了边界检查,而其他方式则没有。这有助于开发。因此,为了进行更平衡的比较,您还需要考虑使用特定库(包括调试!)开发软件实际需要多长时间,以及最终代码的可读性/可维护性。
-
@mtall,我同意在比较这些类型的库时需要考虑多个方面。然而,并不是所有的苹果和梨……你只需要公平地比较它们。因此,我不会将一个库的元素访问与另一个库的全数组操作进行比较。但是分开比较:整个数组操作、模板/视图、元素操作、初始化/生成器。
-
即便如此,还有更多需要考虑。例如,许多 C++ 库可以使用各种 BLAS 后端进行整个数组操作。是否比较标准 BLAS 或高度优化的版本,如 OpenBLAS 或 Intel MKL?整个数组操作还受矩阵是动态分配还是固定大小(即,大小指定为模板参数)的影响。在后一种情况下,C++ 编译器可能会生成更好的代码。这反过来又带来了关于给定编译器能力的问题,例如。对于给定的代码,一个编译器可能比另一个编译器优化更多/更少。
标签: c++ random multidimensional-array blitz++