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, и могут не генерировать векторизованный код, когда вы от них ожидали. Единственный способ узнать это - попробовать.