Может ли CUDA использовать SIMD-расширения?

Я немного разбираюсь в Google, но теперь мне непонятно, могут ли некоторые графические процессоры, запрограммированные с CUDA, использовать или могут использовать инструкции, аналогичные инструкциям из расширений SSE SIMD; например, можем ли мы суммировать два вектора поплавков в двойной прецессии, каждый из которых имеет 4 значения. Если это так, я задаюсь вопросом, было бы лучше использовать более легкие потоки для каждого из предыдущих 4 значений вектора или использовать SIMD.

Ответ 1

Программы CUDA скомпилированы в набор инструкций PTX. Этот набор инструкций не содержит инструкций SIMD. Таким образом, программы CUDA не могут явно использовать SIMD.

Однако вся идея CUDA заключается в том, чтобы делать SIMD в широких масштабах. Отдельные потоки являются частью групп, называемых деформациями, внутри которых каждый поток выполняет точно такую ​​же последовательность инструкций (хотя некоторые из инструкций могут быть подавлены для некоторых потоков, что создает иллюзию разных последовательностей выполнения). NVidia называет это Single Instruction, Multiple Thread (SIMT), но по сути это SIMD.

Ответ 2

Как упоминалось в комментарий к одному из ответов, графический процессор NVIDIA имеет несколько SIMD-инструкций. Они работают на unsigned int на каждый байт и на половину слова. По состоянию на июль 2015 года существует несколько вариантов следующих операций:

  • абсолютное значение
  • сложение/вычитание
  • вычислительное среднее значение
  • Comparision
  • максимальное/минимальное
  • Отрицание
  • сумма абсолютной разницы