Как подготовить большой объем данных для векторных инструкций (OpenCL)?

Я выполняю параллельную обработку данных в OpenCL и хотел бы увеличить пропускную способность с помощью векторных инструкций (SIMD). Чтобы использовать int4, double2 и т. д., мне нужно прочесать массивы входных данных. Как лучше всего это сделать?

От

A[0] A[1] A[2] ... A[N] B[0] B[1] B[2] ... B[N] C[0]...C[N] D[0]...D[N]

как один комбинированный буфер или отдельные

To

A[0] B[0] C[0] D[0] A[1] B[1] C[1] D[1] ... A[N] B[N] C[N] D[N]

N может достигать 20000, а сейчас удваивается. Я использую GCN GPGPU, предпочтительный размер двойного вектора — 2.

-Должен ли я подготовить другое ядро, которое прочесывает данные для определенной ширины вектора?

-Я полагаю, что процессор будет работать медленно, делая то же самое.


person kvik    schedule 17.04.2014    source источник
comment
какой алгоритм вы собираетесь использовать с данными после их переноса?   -  person mfa    schedule 17.04.2014


Ответы (1)


В зависимости от вашего устройства вы можете не выиграть, переписав код OpenCL C для использования векторов.

В оборудовании AMD предыдущего поколения (VLIW4/5) вы могли получить выигрыш, используя векторы (например, float4), потому что это был единственный раз, когда использовалось векторное оборудование. Однако новое аппаратное обеспечение AMD (GCN) является скалярным, и компилятор масштабирует ваш код. То же самое и с оборудованием NVIDIA, которое всегда было скалярным.

Я думаю, что даже на ЦП, который может использовать векторные инструкции SSE/AVX, компиляторы масштабируют ваш код, а затем запускают несколько рабочих элементов по векторным дорожкам (авто-векторизация).

Поэтому сначала попробуйте пример, прежде чем тратить время на векторизацию всего.

Вместо этого вы можете сосредоточить свои усилия на обеспечении полного объединения обращений к памяти; обычно это большая победа.

person Dithermaster    schedule 19.04.2014