C ++ amp — Использование C ++ — AMP для сокращения времени выполнения несортированного векторного поиска

Я написал программу, которая выполняет большой поиск по несортированному вектору структуры, чтобы найти индексы уникальных элементов. Этот поиск выполняется несколько раз на каждой итерации цикла for, а также данные внутри вектора меняются несколько раз в течение цикла for (цикл только добавляется, ничего не удаляется). Теперь программа делает то, что я хочу, но она работает довольно медленно, поэтому после того, как я позволил VS2012 проанализировать производительность моей программы, я обнаружил, что более 80% времени программа выполняет поиск по несортированному вектору, поэтому, естественно, я хочу оптимизировать поиск. Я знаю, что лучшее, что я могу получить, это O (n), потому что это несортированный вектор (каждый элемент уникален, и порядок элементов не может измениться после их вставки), но я надеюсь как-то сократить время выполнения.

Я думал об использовании параллельной обработки для сокращения времени выполнения программ, и библиотека AMP от Microsoft выглядит многообещающе. Судя по всему, вы можете использовать параллельную обработку для перебора массива, чтобы найти элемент в массиве. Но данные в несортированном векторе сильно меняются, поэтому не будет ли это перемещать узкое место от итерации вектора к передаче данных из ЦП в ГП или к встроенным функциям оптимизации AMP, чтобы справиться с этим? Помните: данные в векторе добавляются только в конце вектора, ничего не удаляется.

На всякий случай это поможет: вот вектор и функция поиска, которую я использую:

struct VertexData
{
VertexData( unsigned int pos, unsigned int norm, unsigned int tex )
: posIdx(pos), normIdx(norm), texIdx(tex) {}

unsigned int posIdx;
unsigned int normIdx;
unsigned int texIdx;

inline bool operator<( const VertexData &rhs ) const
{
return std::tie(posIdx, normIdx, texIdx) < std::tie(rhs.posIdx, rhs.normIdx, rhs.texIdx);
}

inline bool operator==( const VertexData &rhs ) const
{
return std::tie(posIdx, normIdx, texIdx) == std::tie(rhs.posIdx, rhs.normIdx, rhs.texIdx);
}
};

std::vector<VertexData> verts;

int findIndex( const std::vector<VertexData> &vec, const VertexData &val ) const
{
std::vector<VertexData>::const_iterator it;
int idx = 0;
for ( it = vec.begin(); it != vec.end(); ++it, ++idx )
if ( *it == val )
return idx;

return -1;
}

1

Решение

Не могли бы вы использовать что-то вроде массива boost :: multi-index для хранения отсортированного уникального набора индексов в вашем несортированном векторе? Таким образом, вы избегаете лишней работы каждый раз.

Алгоритмические исправления, как правило, всегда лучше, чем грубая сила.

2

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

Других решений пока нет …