OpenCL: как избежать дублирования скалярных / векторных функций? - PullRequest
1 голос
/ 16 июня 2020

Встроенные математические функции OpenCL принимают абстрактные gentype в качестве типов аргументов, поэтому у вас есть только одна exp(x) или log(x) функция, и компилятор автоматически переключается на правильную в зависимости от фактического типа аргументов, когда вы их вызываете. .

Мне нужно запрограммировать другие математические функции, которые будут выполнять набор базовых c алгебр c операций, таких как (log(a / b) - c) / d (без вертикальной векторной алгебры), но иногда на float скалярах, иногда на float4 векторов. Есть ли чистый способ кодировать их только один раз и переключать компилятор одинаково в зависимости от типа аргумента?

В качестве альтернативы, если я напишу только скалярный код float и l oop вместо float4 может ли компилятор его векторизовать?

Ответы [ 3 ]

1 голос
/ 16 июня 2020

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

Один из способов использовать их будет иметь макрос для типа, например, вот так:

#define vt(t,s) t##s
#define vector_type(t,s) vt(t,s)

typedef vector_type(float, VECTOR_SIZE) vfloat;

А затем, например, VECTOR_SIZE=4 можно передать компилятору для использования float4. Но это будет работать только для векторных типов. Чтобы использовать, требуется ли float или float4 немного другой макрос.

В качестве альтернативы, если я напишу только скалярный код с плавающей запятой и l oop поверх float4 для его применения, может ли компилятор векторизовать его?

Может или не может, это зависит от многих вещей. Кроме того, компиляторы OpenCL не так продвинуты, как, например, g cc, и могут не генерировать векторизованный код, когда вы от них ожидали. Единственный способ узнать это - попробовать.

0 голосов
/ 05 июля 2020

Вы можете использовать «C ++ для OpenCL» (который не является OpenCL C ++) и использовать шаблон C ++ в коде ядра. Большинство современных реализаций на основе LLVM поддерживают его, но вам нужно будет проверить свою c платформу (ы).

0 голосов
/ 17 июня 2020
• 1000 ). 1002 * Так, казалось бы, что скалярная код правильно векторизации, когда это необходимо, и мне не нужно, чтобы поддерживать * 1004 Удельный * векторизованную путь вручную.
...