Как известно, OpenCL вектор типа float16
Должны ли мы использовать векторные типы, если мы хотим написать один раз оптимизированный код для обоих: CPU и GPU?
float16
на AMD GPU (GCN) не использует сложение векторных операций, так как векторные операции используются даже без вектора-типов с помощью волнового фронта (каждый поток = каждая SIMD-полоса). То естьfloat16
может помочь только для загрузки/магазина на большой ширины шины памяти, например, на НВМ (с высокой пропускной способностью памяти): https://stackoverflow.com/a/42315728/1558037но
float16
на AMD процессор рекомендуется использовать для вовлечения SIMD-полос центрального процессора (потому что каждый поток = каждый процессор весь процессор, не SIMD-пер): http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-resources/programming-in-opencl/image-convolution-using-opencl/image-convolution-using-opencl-a-step-by-step-tutorial-5/
в ре Sult:
на GCN в один вид резьбы один элемент SIMD - то есть один нить, отображенные на одном SIMD-лейн): Is there any guarantee that all of threads in WaveFront (OpenCL) always synchronized?
на CPU один нить отображается на одно целое CPU-Core (со многими SIMD-блоками, каждый со многими SIMD-полосами)
I.e. векторные типы, такие как float16
, не имеют большого значения для графического процессора, но имеют большое значение для ЦП.
Должны ли мы использовать векторные типы, если мы хотим написать один раз оптимизированный OpenCL-код для обеих архитектур: CPU и GPU?
ЗАКЛЮЧЕНИЕ:
векторные типы не очень нужны для GPU или Intel-CPU, но необходимы для AMD-процессор.
Вы проверили, сколько VGPR используется при использовании float16 vs float, используя код ISA, выводимый из профайлера, такого как CodeXL? –
@huseyin tugrul buyukisik Нет, я этого не делал. Что вы имеете в виду, есть ли в моих высказываниях какие-то ошибки? – Alex
Нет, просто сказать, что некоторые оптимизации видны именно так. Например, мой gpu компилирует для использования vgpr даже когда я не использую векторы. Vgpr имеет больше памяти, чем sgpr в моем amd gpu –