- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我用下面的代码对比了blitz++、armadillo、boost::MultiArray(借用自an old post)
#include <iostream>
using namespace std;
#include <windows.h>
#define _SCL_SECURE_NO_WARNINGS
#define BOOST_DISABLE_ASSERTS
#include <boost/multi_array.hpp>
#include <blitz/array.h>
#include <armadillo>
int main(int argc, char* argv[])
{
const int X_SIZE = 1000;
const int Y_SIZE = 1000;
const int ITERATIONS = 100;
unsigned int startTime = 0;
unsigned int endTime = 0;
// Create the boost array
//------------------Measure boost Loop------------------------------------------
{
typedef boost::multi_array<double, 2> ImageArrayType;
ImageArrayType boostMatrix(boost::extents[X_SIZE][Y_SIZE]);
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
for (int x = 0; x < X_SIZE; ++x)
{
for (int y = 0; y < Y_SIZE; ++y)
{
boostMatrix[x][y] = 1.0001;
}
}
}
endTime = ::GetTickCount();
printf("[Boost Loop] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
}
//------------------Measure blitz Loop-------------------------------------------
{
blitz::Array<double, 2> blitzArray( X_SIZE, Y_SIZE );
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
for (int x = 0; x < X_SIZE; ++x)
{
for (int y = 0; y < Y_SIZE; ++y)
{
blitzArray(x,y) = 1.0001;
}
}
}
endTime = ::GetTickCount();
printf("[Blitz Loop] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
}
//------------------Measure armadillo loop----------------------------------------
{
arma::mat matArray( X_SIZE, Y_SIZE );
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
for (int y = 0; y < Y_SIZE; ++y)
{
for (int x = 0; x < X_SIZE; ++x)
{
matArray(x,y) = 1.0001;
}
}
}
endTime = ::GetTickCount();
printf("[arma Loop] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
}
//------------------Measure native loop----------------------------------------
// Create the native array
{
double *nativeMatrix = new double [X_SIZE * Y_SIZE];
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
for (int y = 0; y < Y_SIZE*X_SIZE; ++y)
{
nativeMatrix[y] = 1.0001;
}
}
endTime = ::GetTickCount();
printf("[Native Loop]Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
delete[] nativeMatrix;
}
//------------------Measure boost computation-----------------------------------
{
typedef boost::multi_array<double, 2> ImageArrayType;
ImageArrayType boostMatrix(boost::extents[X_SIZE][Y_SIZE]);
for (int x = 0; x < X_SIZE; ++x)
{
for (int y = 0; y < Y_SIZE; ++y)
{
boostMatrix[x][y] = 1.0001;
}
}
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
for (int x = 0; x < X_SIZE; ++x)
{
for (int y = 0; y < Y_SIZE; ++y)
{
boostMatrix[x][y] += boostMatrix[x][y] * 0.5;
}
}
}
endTime = ::GetTickCount();
printf("[Boost computation] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
}
//------------------Measure blitz computation-----------------------------------
{
blitz::Array<double, 2> blitzArray( X_SIZE, Y_SIZE );
blitzArray = 1.0001;
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
blitzArray += blitzArray*0.5;
}
endTime = ::GetTickCount();
printf("[Blitz computation] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
}
//------------------Measure armadillo computation-------------------------------
{
arma::mat matArray( X_SIZE, Y_SIZE );
matArray.fill(1.0001);
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
//matArray.fill(1.0001);
matArray += matArray*0.5;
}
endTime = ::GetTickCount();
printf("[arma computation] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
}
//------------------Measure native computation------------------------------------------
// Create the native array
{
double *nativeMatrix = new double [X_SIZE * Y_SIZE];
for (int y = 0; y < Y_SIZE*X_SIZE; ++y)
{
nativeMatrix[y] = 1.0001;
}
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
for (int y = 0; y < Y_SIZE*X_SIZE; ++y)
{
nativeMatrix[y] += nativeMatrix[y] * 0.5;
}
}
endTime = ::GetTickCount();
printf("[Native computation]Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
delete[] nativeMatrix;
}
return 0;
}
在windows,VS2010上,结果是
[Boost Loop] Elapsed time: 1.217 seconds
[Blitz Loop] Elapsed time: 0.046 seconds
[arma Loop] Elapsed time: 0.078 seconds
[Native Loop]Elapsed time: 0.172 seconds
[Boost computation] Elapsed time: 2.152 seconds
[Blitz computation] Elapsed time: 0.156 seconds
[arma computation] Elapsed time: 0.078 seconds
[Native computation]Elapsed time: 0.078 seconds
在windows,intel c++上,结果是
[Boost Loop] Elapsed time: 0.468 seconds
[Blitz Loop] Elapsed time: 0.125 seconds
[arma Loop] Elapsed time: 0.046 seconds
[Native Loop]Elapsed time: 0.047 seconds
[Boost computation] Elapsed time: 0.796 seconds
[Blitz computation] Elapsed time: 0.109 seconds
[arma computation] Elapsed time: 0.078 seconds
[Native computation]Elapsed time: 0.062 seconds
有些奇怪:
(1) with VS2010, native computation (including loop) is faster than native loop
(2) blitz loop behave so different under VS2010 and intel C++.
要使用 intel c++ 编译器编译 blitz++,blitz/intel/文件夹中需要一个名为 bzconfig.h 的文件。但是没有。我只是复制 blitz/ms/bzconfig.h 中的那个。这可能会给出非最佳配置。任何人都可以告诉我如何使用 intel c++ 编译器编译 blitz++?在手册中,它说运行 bzconfig 脚本以获取正确的 bzconfig.h。但我不明白这是什么意思。
非常感谢!
添加一些我的结论:
1. Boost multi array is the slowest.
2. With intel c++ compiler, native pointers are very fast.
3. With intel c++ compiler, armadillo can achieve the performance of native pointers.
4. Also test eigen, it is x0% slower than armadillo in my simple cases.
5. Curious about blitz++'s behavior in intel c++ compiler with proper configuration.
Please see my question.
最佳答案
简答:./configure CXX=icpc
,通过阅读 Blitz++ 用户指南找到。
长答案:
To compile blitz++ with intel c++ compiler, a file called bzconfig.h is required in blitz/intel/ folder. But there isn't.
是的,是的。 Blitz++ 应该自己生成文件。根据 blitz-0.10.tar.gz
中包含的 Blitz++ 用户指南 blitz.pdf
,“安装”部分,
Blitz++ uses GNU Autoconf, which handles rewriting Makefiles for various platforms and compilers.
更准确地说,Blitz++ 使用 GNU autotools 工具链(automake、autoconf、configure),可以生成 makefile、配置脚本、头文件等。 bzconfig.h
文件应该是由 Blitz++ 自带的 configure
脚本生成的,可以直接使用。
I just copy the one in blitz/ms/bzconfig.h in. That may give an non-optimal configuration.
如果“非最佳”对您来说意味着“不工作”,那么是的。 :-)您需要一个准确代表您的编译器的 intel/bzconfig.h
。
Anyone can tell me how to compile blitz++ with intel c++ compiler?
阅读并遵循精美的手册,尤其是上面提到的“安装”部分。
go into the ‘blitz-VERSION’ directory, and type:
./configure CXX=[compiler]
where [compiler] is one of xlc++, icpc, pathCC, xlC, cxx, aCC, CC, g++, KCC, pgCC or FCC. (If you do not choose a C++ compiler, the configure script will attempt to find an appropriate compiler for the current platform.)
你做过吗?对于英特尔编译器,您需要使用./configure CXX=icpc
.
In the manual, it said run bzconfig script to get the right bzconfig.h. But I don't understand what it means.
我假设“它”是指“那个”。 “手动”是什么意思?我的 Blitz++ 用户指南没有提到 bzconfig
。您确定您使用的是与您的 Blitz++ 版本对应的手册吗?
PS:在blitz-0.10的内容中寻找“bzconfig” ,看起来“bzconfig”不再是 Blitz++ 的一部分,而是曾经是:
找到 . -name bzconfig
-> 没有结果
找到 . -print0 | xargs -0 grep -a -i -n -e bzconfig
:
./blitz/compiler.h:44: #error In <blitz/config.h>: A working template implementation is required by Blitz++ (you may need to rerun the compiler/bzconfig script)
这需要更新。
./blitz/gnu/bzconfig.h:4:/* blitz/gnu/bzconfig.h. Generated automatically at end of configure. */
./configure.ac:159:# autoconf replacement of bzconfig
你有它,这些 bzconfig.h
文件应该由 configure
生成。
./ChangeLog.1:1787: will now replace the old file that was generate with the bzconfig
这可能是切换到 autoconf 的变化。
./INSTALL:107: 2. Go into the compiler subdirectory and run the bzconfig
这需要更新。这就是让你寻找 bzconfig
的原因吗?
./README:27:compiler Compiler tests (used with obsolete bzconfig script)
需要更新,不再包含compiler
目录。
关于c++ - 比较 blitz++、 Armadillo 、boost::MultiArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14414906/
我已经使用 blitz 0.09 很长时间了。目前我将它更新为 blitz 0.10。 blitz/tinyvec.h 不见了。有一个类似的blitz/tinyvec2.h。我改成它,但编译不通过。我
我想使用 weave.blitz 来提高以下 numpy 代码的性能: def fastIteration(self): g = self.grid nx,ny = g.ux.shap
我正在尝试使用 blitz++ 数组,因为我知道它们通常比其他形式的数组提供更高的性能。是否可以使用 blitz++ 数组作为 map 中的键?尝试 #include #include using
我正在用 C++ 开发一个具有许多功能的项目。我不想在主程序中编写它们,而是想为每个函数编写一个单独的 .cpp 文件。这些函数中的大多数都会作用于一些数组,所以我希望将这些数组设为全局。所以我在一个
我正在尝试比较 Blitz++/Armadillo/Eigen 和我自己的库的性能。 我目前正在使用 Blitz++ 执行以下操作: ... Array s(samples); Uniform ran
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
我是 blitz++ 新手。到目前为止一切顺利,但我有点不明白为什么下面代码中注释掉的行无法通过 编译 error: conversion from ‘blitz::_bz_tinyMatExpr >
我正在使用 Blitz++ 并进行一些精美的包装。Array 的构造函数可以将存储类型作为参数之一。默认情况下,这是 GeneralArrayStorage() .我一直在查看文档,但没有找到任何方法
我正在用C++启动一个新的科学计算项目,并且由于其中包括许多数值上广泛的过程,因此我正在考虑使用Armadillo或Blitz++进行有效的数组/矩阵/张量处理。哪个更好用? 最佳答案 我们对Arma
我有一个 FFT 程序 fftconvx取两个张量 Ttnsr和 S作为输入参数并将结果生成到另一个张量 G .所有张量都定义为 Blitz++ 数组 Array, N> , 其中N是数组的秩。程序f
我正在尝试使用 Blitz++ 用户指南中的模板对象 #include using namespace blitz; BZ_DECLARE_STENCIL4(test,P1,P2,P3,c)
我正在尝试使用 weave.blitz 来加速某些代码,但我不断收到以下 DLL 错误。如果我运行一个简单的代码,例如 from scipy import * # or from NumPy impo
我知道 Blitz++ 通过广泛使用表达式模板和模板元程序来提高性能。但在某些时候,您无法通过使用这些技术从代码中获得更多 yield ——您必须对一些 float 进行乘法和求和。此时,您可以通过使
我有一个我用 vs 2010 编写的项目。在这个项目中使用了 blitz。但是现在当我在 2013 年打开这个项目并尝试运行它时。一些错误说: error C2955: 'std::rank' : u
我对这个论坛抱有很大的怀疑,但我愿意感到惊喜;)向那些让我重回正轨的人表示敬意和巨大的业力。 我正在尝试使用 JavaSpaces ( http://www.dancres.org/blitz/bli
我有一个与此相关的问题:GTest fixture when constructor takes parameters? .我是那个问题,我想知道当被测试的类为构造函数获取参数时如何设置 GTest
如何使用 blitz++ 声明一个 3d 数组(就像嵌套在数组中的数组,数组又嵌套在数组中)?假设尺寸为 3、4、5。另外我将如何访问所述数组元素?你能告诉我如何获得这个多维数组的每个维度的大小吗?对
我用下面的代码对比了blitz++、armadillo、boost::MultiArray(借用自an old post) #include using namespace std; #includ
我设置了一个简单的 Django 应用程序,我一直在使用 Blitz.io 对其进行测试。当我用许多测功机进行测试时,我可以在 http://X.com 上获得数千个请求/秒当我切换到 https:/
我刚刚找到了很棒的 Stackblitz 在线 VS Code 编辑器。我创建了一个 Angular 项目并在 dependencies 下安装了 Bootstrap CSS 框架,但是我应该如何将
我是一名优秀的程序员,十分优秀!