2017-02-19 51 views
1

Как известно, 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/

enter image description here


в ре 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-процессор.

+0

Вы проверили, сколько VGPR используется при использовании float16 vs float, используя код ISA, выводимый из профайлера, такого как CodeXL? –

+0

@huseyin tugrul buyukisik Нет, я этого не делал. Что вы имеете в виду, есть ли в моих высказываниях какие-то ошибки? – Alex

+1

Нет, просто сказать, что некоторые оптимизации видны именно так. Например, мой gpu компилирует для использования vgpr даже когда я не использую векторы. Vgpr имеет больше памяти, чем sgpr в моем amd gpu –

ответ

2

В целом, если производительность - это то, о чем вас беспокоит, почти всегда плохая идея использовать одно и то же ядро ​​для разных архитектур. Желательные векторы GC-GCN, желаемые скаляры GCN, процессоры могут обрабатывать как драйвер Intel, но только если вы осведомлены об этом, и я не знаю, как драйвер AMD работает на процессоре. В то время как процессору нужны более широкие векторы, чем GPU. Процессоры полагаются на кеш, а GPU больше полагаются на память с нуля. Графические процессоры имеют безумно больше регистров, чем процессоры могут даже мечтать о ...

На самом деле векторные типы GCN просто заставляют меня чувствовать, что мой код выглядит лучше, и сэкономить время на ввод и ошибки. float v [4], float4 v или даже float v0, v1, v2, v3, не имеет большого значения в течение большей части времени.

Как уже говорилось ранее, драйвер CL Intel может отображать нить в элемент SIMD, который создает один сердечник 8 CL потоков.

+0

amd, используя SSE при использовании векторов, я тестировал его, но его нигде не приближалось к производительности ручной сборки (возможно, это просто мой fx8150). компилятор intels намного лучше. переход от float к float4 делает его x2 - x2.5 так же быстрым, а float8 приближается к x3 как можно быстрее. –

+0

может быть разрыв производительности между сборкой происходит из переходов AVX-SSE - MMX, если существует –

+0

На Intel-драйвере float может быть таким же быстрым, как float8, если вы сделали это правильно. Но использование AVX без CL намного проще и разумнее, по крайней мере, я думаю. – BlueWanderer