矢量化我的标量函数

时间:2016-01-08 20:51:41

标签: opencl vectorization

假设我想计算升余弦。我可以有一个#define cos_raised(x) (0.5f + 0.5f * cos(x))的宏,但为了我的问题,我想让它成为一个函数,像这样:

float cos_raised(float x)
{
    return 0.5f + 0.5f * cos(x);
}

这很好但只有一个浮点输入才可以很容易地进行矢量化。如何正确地向量化它并使其接受float2 / 3/4/8/16作为输入和输出而不复制函数体(这是一个简单的例子,但我需要知道更复杂的函数)? / p>

编辑:我想我问的是如何制作一个gentype函数?只是输入gentype不起作用。

3 个答案:

答案 0 :(得分:0)

IIRC:可悲的是," gentype"是一个仅存在于OpenCL文档中的概念,它实际上并不是一种语言功能,它允许您自己创建通用/类似模板的功能。这意味着没有简单的方法来做你想做的事情,你可能必须使用一些预处理器魔术来最小化代码重复。参见例如这个SO帖子:How to use C++ templates in OpenCL kernels?提供了比我更多的知识。

答案 1 :(得分:0)

如果编译器在进行矢量化之前内联所有函数调用,那么你们都已经设置好了。顺便说一句,矢量化可能只需要CPU执行,因为现在大多数GPU都是标量。

答案 2 :(得分:0)

由于OpenCL内核在运行时编译,您可以在内核的开头添加额外的代码行。我通过使用模板功能(例如存储在单独的文本文件中)来使用它,如下所示:

float{N:} cos_raised_float{N:}(float{N:} x)
{
    return 0.5f + 0.5f * cos(x);
}

由于我对Python比较熟悉,因此我使用它的语法来指定字符串中的占位符,即{N:}。您必须为主持人代码的语言找到类似的东西。之后,只需要循环经过2,3,4,8和16,每次填充{N:}。这为您提供了五个额外的字符串,您需要将这些字符串添加到内核代码的开头。缺点是你必须想出一些方法在主内核代码中指出应该插入所有这些生成的函数。它们需要在所有#pragma XXX: enable语句之后出现。之后,您的内核可以调用任何版本,例如cos_raised_float4