提高的MultiArrays性能差(Boost MultiArrays performance is

2019-10-20 08:19发布

我注意到,我的升压mutiarrays进行了比较,STL矢量进行得很厉害。 我来到这个问题刚才问,哪里最喜欢回答说,

1)升压几乎是一样快天然阵列

2)你需要改变你访问你的数据元素,以获得最佳性能加速的MultiArray的顺序。 另外,你需要在发行模式下运行,并且不能进行调试。

好了,我做过的一切,可是我的MultiArrays的性能是相当寒酸。

我在这里发布我的代码:

a)用默认排序

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

int main(int argc, char* argv[])
{
    const int X_SIZE = 400;
    const int Y_SIZE = 400;
    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;
}

B)具有倒订购

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

int main(int argc, char* argv[])
{
    const int X_SIZE = 400;
    const int Y_SIZE = 400;
    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 x = 0; x < X_SIZE; ++x)
        {
            for (int y = 0; y < Y_SIZE; ++y)
            {
                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 x = 0; x < X_SIZE; ++x)
        {
            for (int y = 0; y < Y_SIZE; ++y)
            {
                nativeMatrix[x + (y * X_SIZE)] *= 2.345;
            }
        }
    }
    endTime = ::GetTickCount();
    printf("[Native]Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);

    return 0;
}

在每一个可能的排列,我的基准是大致相同的:

1)本机代码:0.15秒

2)对于升压的MultiArray:1.0秒
我使用Visual Studio 2010。

我的问题是:因为我使用Visual Studio中,如何从加速的MultiArrays不错的表现?

更新:

我切换到Visual Studio 2013年在那里,我启用了Qvec-报告2编译器开关。 而且很有意思的是,当我编译,我开始收到信息消息说,编译器无法量化。 下面是它看起来几乎就像一个警告的样本信息的消息。 我接到好几个这样的消息对于最简单的代码。

---分析函数:void __cdecl`矢量构造器游标'(无效* __ptr64,无符号__int64,整型,无效* __ptr64(__cdecl *)(无效* __ptr64))1> d:\工作区\测试\废料\废料\源的.cpp:信息C5002:循环不矢量由于原因“1301”

我认为这是一个重大线索,为什么升压的MultiArrays是在我的Visual Studio执行速度较慢,而他们在GCC好吗执行。 鉴于这种额外的信息,可以请你想办法来解决这个问题?

@Admins:如前面回答请取消标记我的问题。 我已经作出了重大修改。

文章来源: Boost MultiArrays performance is poor