Медленный доступ к Matlab R2018b TypedArray в C ++ - PullRequest
0 голосов
/ 05 ноября 2018

Я использую мекс-функции MATLAB R2018b для интеграции библиотеки C ++ с моим кодом MATLAB. В связи с этим мне нужно взять данные в массиве MATLAB и сохранить их в массив указателей C ++ и вектор структур C ++. Однако отображение массива с типом Matlab оказывается очень медленным (~ 0,4 секунды для ~ 800 000 элементов).

вот соответствующий код

const matlab::data::TypedArray<float> Vertices = std::move(inputs[0]); 
float* positions = new float[Vertices.getNumberofElements()];
for (size_t i = 0; i < Vertices.getDimensions()[0]; i ++)
{
    ctr = 9 * i;
    positions[ctr + 0] = Vertices[i][0];
    positions[ctr + 1] = Vertices[i][1];
    positions[ctr + 2] = Vertices[i][2]; 
}

Что заставляет этот цикл работать медленно? Я попытался изменить порядок доступа к массиву для Vertices, чтобы сделать код более удобным для кеша, но это не дало существенного ускорения. Прямо сейчас цикл составляет ~ 0,4 мс для 800 000 элементов, в идеале копирование памяти должно занимать гораздо меньше времени, верно?

Просматривая предыдущий совет, я обнаружил, что в большинстве ответов используются более старые mex-функции, где новый (?) API-интерфейс MATLAB C ++ не имеет таких функций или структуры.

Редактировать:

Я последовал совету Криса и использовал цикл по итераторам, который увеличил скорость примерно вдвое до 0,14 секунды.

Новый код, который я использую:

    const matlab::data::TypedArray<float> Vertices = std::move(inputs[0]); 
    float* positions = new float[Vertices.getNumberofElements()];
for (auto it = Vertices.begin(); it != Vertices.end(); ++it)
{
    positions[ctr] = *it; 
    ++ctr; 
} 

Так что это быстрее, но все равно удивительно медленно (0,14 секунды для 800 000 элементов). Есть ли другой способ ускорить этот цикл?

1 Ответ

0 голосов
/ 08 ноября 2018

Я получил значительное ускорение, применив совет Cris и используя следующий код:

const matlab::data::TypedArray<float> Vertices = std::move(inputs[0]);
float* positions = new float[Vertices.getNumberofElements()];
memcpy(positions,&*Vertices.begin,sizeof(float)*Vertices.getNumberofElements());

Время выполнения изменилось с 0,14 (с использованием стандартной оптимизации Visual Studio) до 0,0035, что является приемлемо быстрым для моего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...