gpt4 book ai didi

c++ - Boost::multi_array 性能问题

转载 作者:IT老高 更新时间:2023-10-28 12:49:39 26 4
gpt4 key购买 nike

我正在尝试使用以下测试程序将 boost::multi_array 的性能与本地动态分配的数组进行比较:

#include <windows.h>
#define _SCL_SECURE_NO_WARNINGS
#define BOOST_DISABLE_ASSERTS
#include <boost/multi_array.hpp>

int main(int argc, char* argv[])
{
const int X_SIZE = 200;
const int Y_SIZE = 200;
const int ITERATIONS = 500;
unsigned int startTime = 0;
unsigned int endTime = 0;

// Create the boost array
typedef boost::multi_array<double, 2> ImageArrayType;
ImageArrayType boostMatrix(boost::extents[X_SIZE][Y_SIZE]);

// Create the native array
double *nativeMatrix = new double [X_SIZE * Y_SIZE];

//------------------Measure boost----------------------------------------------
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)
{
boostMatrix[x][y] = 2.345;
}
}
}
endTime = ::GetTickCount();
printf("[Boost] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);

//------------------Measure native-----------------------------------------------
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)
{
nativeMatrix[x + (y * X_SIZE)] = 2.345;
}
}
}
endTime = ::GetTickCount();
printf("[Native]Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);

return 0;
}

我得到以下结果:

[Boost] Elapsed time: 12.500 seconds
[Native]Elapsed time: 0.062 seconds

我不敢相信 multi_arrays 这么慢。谁能发现我做错了什么?

我认为缓存不是问题,因为我正在写入内存。

编辑:这是一个调试版本。根据 Laserallan 的建议,我做了一个发布版本:

[Boost] Elapsed time:  0.266 seconds
[Native]Elapsed time: 0.016 seconds

更接近。但是 16 比 1 对我来说似乎仍然很高。

嗯,没有明确的答案,但我将继续前进,暂时将我的真实代码保留为 native 数组。

接受 Laserallan 的回答,因为这是我测试中最大的缺陷。

谢谢大家。

最佳答案

在我的机器上使用

g++ -O3 -march=native -mtune=native --fast-math -DNDEBUG test.cpp -o test && ./test

我明白了

[Boost] Elapsed time:  0.020 seconds
[Native]Elapsed time: 0.020 seconds

但是将 const int ITERATIONS 更改为 5000 我得到了

[Boost] Elapsed time:  0.240 seconds
[Native]Elapsed time: 0.180 seconds

然后用 ITERATIONS 回到 500X_SIZEY_SIZE 设置为 400 我得到了更显着的差异

[Boost] Elapsed time:  0.460 seconds
[Native]Elapsed time: 0.070 seconds

最终反转 [Boost] 案例的内部循环,使其看起来像

    for (int x = 0; x < X_SIZE; ++x)
{
for (int y = 0; y < Y_SIZE; ++y)
{

并保持 ITERATIONSX_SIZEY_SIZE500400400 我明白了

[Boost] Elapsed time:  0.060 seconds
[Native]Elapsed time: 0.080 seconds

如果我也为 [Native] 情况反转内部循环(因此在这种情况下它的顺序错误),不出所料,我得到,

[Boost] Elapsed time:  0.070 seconds
[Native]Elapsed time: 0.450 seconds

我在 Ubuntu 10.10 上使用 gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

总之:

  • 通过适当的优化 boost::multi_array 可以按预期完成工作
  • 您访问数据的顺序很重要

关于c++ - Boost::multi_array 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/446866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com