Построение valarray с использованием необработанных данных

Кажется, я мог бы использовать std::valarray<_Tp>s для какой-то вычислительной работы (предположим, что _Tp равно uint64_t). К сожалению, справедливо следующее:

  • мой код получает необработанные массивы - uint64_t*s и значение длины -
  • Я не могу изменить подписи/API. Хотя они __restrict__ed.
  • Конструктор std::valarray, который принимает _Tp* и длину, копирует весь массив.
  • Кажется, нет методов для установки внутренних данных std::valarray; он даже частный, поэтому вы не можете получить к нему доступ в подклассе.

Итак, как мне разорвать этот гордиев узел и построить valarray без копирования моих данных?


person einpoklum    schedule 22.04.2015    source источник
comment
Я не думаю, что есть какой-либо способ сделать это. Какие valarray функции вам нужны? Возможно, вам лучше реализовать эту функциональность для вашего необработанного массива.   -  person Praetorian    schedule 23.04.2015
comment
@Praetorian: мне сказали, что valarray - достойный выбор для выполнения побитовых операций над упакованными последовательностями битов.   -  person einpoklum    schedule 23.04.2015
comment
Используете ли вы MSVC (думаю, именно они разрешают расширение __restrict__)? Если это так, взгляните на это, в частности, второй ответ и комментарий Говарда Хиннанта под принятым ответом. Вы проверили сборку из оптимизированной сборки с простым битом цикла for И, выполняя по одному элементу за раз? Возможно, автоматический векторизатор сможет преобразовать это в SIMD-инструкции.   -  person Praetorian    schedule 23.04.2015
comment
Кажется, я неправильно запомнил, это расширение gcc/clang. clang3.5, похоже, готов использовать SIMD, если вы пишете простой цикл for. Мне не удалось заставить gcc использовать регистры xmm, но вам может повезти с дополнительными флагами/прагмами оптимизации.   -  person Praetorian    schedule 23.04.2015
comment
@Praetorian: Ваши комментарии больше относятся к вопросу, на который я ссылался, чем здесь ... во всяком случае, сейчас я использую gcc/Linux.   -  person einpoklum    schedule 23.04.2015