Тип RVV для члена класса в C++

Я хотел бы использовать векторное расширение RISC-V в своем приложении на C++. Я заметил, что для членов класса невозможно использовать типы RVV (например, «vuint32m1_t»). При компиляции с помощью gcc (v13.2.0) я получаю следующую ошибку:

error: member variables cannot have RVV type 'vuint32m1_t'

Я не смог найти ссылки в Интернете.

Я думаю, что решением может быть использование стандартных типов (например, uint32_t) для членов класса и преобразование их в типы RVV всякий раз, когда мне нужно выполнить векторную операцию. Я считаю, что это решение может снизить производительность.

У кого-нибудь есть другие идеи?

Что, если вы просто используете стандартные типы и позволяете компилятору (с включенной оптимизацией) заботиться об оптимизации кода?

Jesper Juhl 04.07.2024 20:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Векторные регистры RVV не зависят от длины вектора, и вы не знаете длину вектора во время компиляции. Вы не можете поместить векторные типы RVV непосредственно в классы, поскольку размер класса и структуры должен быть известен во время компиляции.

Обычно вам не нужно хранить векторы в классах, вместо этого вы сохраняете данные и загружаете их при необходимости. В противном случае вы могли бы выделить достаточно места для вектора, запрашивая длину вектора во время выполнения. Оба эти метода проблематичны, если вам нужно часто загружать в хранилище одни и те же данные, поскольку gcc и clang еще не могут выполнить исключение хранилища с предикатной векторной загрузкой.

Если вы нацелены на определенную длину вектора и только на эту конкретную длину вектора, вы можете использовать атрибут riscv_rvv_vector_bits, который можно размещать внутри структур и классов. Пожалуйста, не используйте это, если можете этого избежать, это делает ваш код непереносимым.

Действительно ли вам нужно поместить векторы непосредственно в класс для решения вашей задачи? Часто можно изменить API, чтобы он не был нужен, например. forEach функция обратного вызова вместо API-итератора, но иногда вы не можете изменить API.

Я пытаюсь собрать случаи, когда вам действительно нужна эта функция, потому что есть решение, которое дает вам 95% результатов, но его не так-то просто реализовать. Компиляция может предоставить тип с фиксированным размером 512 бит и сгенерировать код таким образом, что, когда длина вашего вектора меньше, вы просто получаете доступ к младшим битам, а когда длина вашего вектора больше, вы не используете дополнительные кусочки ваших векторов. Это дает вам код, полностью независимый от длины вектора, который масштабируется от VLEN=128 до VLEN=512. Он также будет работать на VLEN>512, хотя и без полного использования возможностей вашего оборудования.

Спасибо за ваш ответ. Я полностью согласен, что это нестандартный способ использования RVV. Однако мне нужно портировать код SSE2, в котором есть член класса типа __m128i. В этом классе много векторных операций, а отсутствие члена класса типа RVV заставляет меня очень часто загружать и сохранять вектор.

rrpp1045 05.07.2024 00:05

Другие вопросы по теме

Похожие вопросы

Как передать значение A::a другому классу B::b, если в классе A у меня есть объект класса B
Как получить MAC-адрес моего локального сетевого интерфейса с помощью сокета Win или удаленного IP-адреса
Использование Open62541 для подключения к серверу не удалось из-за «Не найдено подходящего UserTokenPolicy для возможных конечных точек»
Информация о растровом изображении регулярно возвращает серию одних и тех же неправильных значений, прежде чем возвращать правильные цвета пикселей
Перемещение std::thread со ссылками
Как выбрать правильную перегрузку шаблона функции?
Ошибка EVP_DigestVerifyFinal — ECDSA P-256/SHA-256 с OpenSSL (Libcrypto)
Почему я получаю сообщение об ошибке «Ошибка анализа JSON: тип [json.Exception.type_error.302] должен быть массивом, но является объектом»
Переменная, условно объявленная constexpr в соответствии с выражением ее инициализации
Почему я получаю разные значения от this_thread::get_id() и gettid()?