Повышение производительности MultiArrays плохое

Я заметил, что мои просвечивающие mutiarrays работали очень плохо по сравнению с вектором STL. Я наткнулся этот вопрос спросил ранее, где самый понравившийся ответ заявил, что

1) Boost почти так же быстро, как собственный массив

2) Вам нужно изменить порядок доступа к элементам данных, чтобы получить максимальную производительность от Boost MultiArray. Также, что вам нужно запускать в режиме Release, а не Debug.

Ну, я сделал все это, и все же производительность моего MultiArrays довольно плохая.

Я публикую свой код здесь:

А) С ЗАКАЗОМ ПО УМОЛЧАНИЮ

#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;
}

Б) С ЗАКРЫТЫМ ЗАКАЗОМ

#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) Для Boost MultiArray: 1.0s
Я использую Visual Studio 2010.

Мой вопрос: учитывая, что я использую Visual Studio, как получить хорошую производительность от Boost MultiArrays?

ОБНОВИТЬ :

Я переключился на Visual Studio 2013. Там я включил переключатель компилятора Qvec-report2. И что очень интересно, когда я компилировал, я начал получать информационное сообщение о том, что компилятору не удалось векторизовать. Вот пример информационного сообщения, которое выглядит почти как предупреждение. Я получил несколько таких сообщений для простейшего кода.

— Анализирующая функция: void __cdecl `итератор векторного конструктора ‘(void * __ptr64, без знака __int64, int, void * __ptr64 (__cdecl *) (void * __ptr64))
1> D: \ Workspace \ test \ Scrap \ Scrap \ Source.cpp: info C5002: цикл не векторизован по причине «1301»

Я думаю, что это главный ключ к пониманию того, почему мультимассивы Boost работают медленнее в моей Visual Studio, в то время как они хорошо работают в GCC. Учитывая эту дополнительную информацию, не могли бы вы придумать, как решить проблему?

@Admins: Пожалуйста, снимите отметку с моего вопроса, как и ранее. Я сделал серьезное редактирование.

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]