Хобрук: Ваш путь к мастерству в программировании

Быстрое преобразование в число с плавающей запятой

Я делаю вычисления в Cuda, используя floats. Поскольку у нас недостаточно памяти на графическом процессоре, мы храним необработанные данные как uint16_t и int16_t на графическом процессоре. Таким образом, прежде чем использовать эти данные, я должен преобразовать их в floats. Количество int не так уж велико (примерно 12k uint16_t и столько же int16_t). Профилирование показало, что преобразование чисел занимает значительное время (около 5-10%). Остальные расчеты не могут быть оптимизированы больше. Таким образом, мои 3+1 вопросы таковы:

  • Каков самый быстрый способ конвертировать ints в floats.
  • Есть ли существенная разница при преобразовании int16_t или uint16_t.
  • Есть ли существенная разница при преобразовании больших типов int, например. int32 или int64.
  • Почему все вопросы на SO касаются преобразования floats в ints. Это то, что обычно не делают?

  • Что именно вы имеете в виду под конвертировать? int16_t x =...; float f = float(x);? 07.02.2021
  • @churill Да, именно так. 07.02.2021
  • Это преобразование происходит в CUDA или на границе CUDA/не CUDA? (предполагаю первое). Как выглядит ваша существующая конверсия? Как выглядят оставшиеся вычисления, хотя бы в псевдокоде? Вы используете все поплавки, которые производите? Насколько разделимы эти ценности? 16-битное целое в 32-битное число с плавающей запятой должно быть битовым сдвигом; подписал немного сложнее. 07.02.2021
  • Этот ответ относится к вашей проблеме, и 16-битное целое число в значительной степени впишется в дробную часть, но я боюсь цикл while для определения необходимого переключения замедлится еще больше... 07.02.2021
  • Компилятор GPU выдаст аппаратную инструкцию для простого преобразования. В документации отмечается, что пропускная способность составляет 16 или 32 инструкции за такт на мультипроцессор. Исходя из этого, я предполагаю, что ваш микробенчмаркинг неверен, и то, что вы приписываете стоимости конверсии, является чем-то другим. 07.02.2021
  • @Yakk В CUDA. В настоящее время я использую static_casts. Псевдокод: привести int к float; Перебрать все числа с плавающей запятой, чтобы вычислить основное значение; Снова выполните цикл по всем числам с плавающей запятой и используйте основное значение для вычисления результата; я совершенно уверен, что этот алгоритм невозможно оптимизировать. 08.02.2021
  • Спасибо всем. Вы очень помогли. 08.02.2021

Ответы:


1
  • Каков самый быстрый способ преобразования целых чисел в числа с плавающей запятой.

Простое задание. Существуют аппаратные типа инструкции по преобразованию, которые компилятор CUDA выдаст автоматически без вашего участия. Аппаратное преобразование включает правильные режимы округления IEEE.

  • Есть ли существенная разница при преобразовании int16_t или uint16_t.

No.

  • Есть ли существенная разница при преобразовании больших типов int, например. int32 или int64.

Нет.Да. Пропускная способность инструкций по преобразованию типов задокументирована< /а>. Инструкции преобразования 32-битных и 16-битных целых чисел в числа с плавающей запятой имеют одинаковую производительность. 64-битные инструкции преобразования значительно медленнее, чем 16- и 32-битные инструкции преобразования на большинстве архитектур.

  • Почему на SO все вопросы о преобразовании чисел с плавающей запятой в целые. Это то, что обычно не делают?

Потому что многие люди не понимают разницы между типами float и int и почему они теряют точность при преобразовании своего типа float или double в тип int.
Вам не о чем беспокоиться в вашей ситуации.

07.02.2021
Новые материалы

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

React Hooks: основы деструктуризации массива
Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

Пакеты R, используемые в Tesla
Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

Сокращение и слияние токенов для эффективных моделей VL: обзор
Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..