В дополнение к правильному замечанию @ jalf, что фактическое копирование подвекторов в свежие векторы может быть пустой тратой времени и пространства, позвольте мне указать на valarray .
Intro: valarray
Valarray может быть более сложным, но особенно в условиях параллельной обработки, может привести к улучшению способов подвекторной работы для различных потоков.Что нужно искать:
- алгоритмическая предварительная наука (если местоположения в определенном шаблоне имеют определенное свойство (например, известно, что оно равно нулю), вы можете передать его оптимизированному рабочему для этих значений)
- выравнивание субвекторов (с помощью aligment можно создавать или нарушать доступность SIMD, оптимизированных версий SSE4; для получения дополнительной информации обратитесь к gcc -ftree-vectorizer)
Теперь в Valarrays достаточноряд «непонятных» операций и хитростей к ним (gslices; в основном, измеренные размеры массива для адресации к исходному массиву), которые я не буду здесь вдаваться, но достаточно сказать, что если вы хотите выполнить сжатие чисел через подмножества смежныхмассивы (в основном) с плавающей точкой [1], это будет полезно прочитать о них.
Обязательный (braindead) тизер
// mask_array example
#include <iostream>
#include <valarray>
using namespace std;
int main ()
{
valarray<int> myarray (10);
for (int i=0; i<10; ++i) myarray[i]=i; // 0 1 2 3 4 5 6 7 8 9
valarray<bool> mymask (10);
for (int i=0; i<10; ++i)
mymask[i]= ((i%2)==1); // f t f t f t f t f t
myarray[mymask] *= valarray<int>(10,5); // 0 10 2 30 4 50 6 70 8 90
myarray[!mymask] = 0; // 0 10 0 30 0 50 0 70 0 90
cout << "myarray:\n";
for (size_t i=0; i<myarray.size(); ++i)
cout << myarray[i] << ' ';
cout << endl;
return 0;
}
Это было скопировано дословно из вышеуказанной ссылки, вызахочет адаптироваться к вашим конкретным потребностям.Вероятно, была веская причина, почему вы держали конечную цель немного расплывчатой, поэтому я с радостью предоставлю вам остальную часть работы!
Заключение
Если вы действительно хотите пройти всетем не менее, вы должны начать смотреть на большие пушки (Blitz ++ и др.).
[1] они исторически были в центре внимания векторизованных наборов команд ЦП.Тем не менее, примечания als @jalf, SSE2 и выше также содержат целочисленные инструкции SIMD