【发布时间】:2016-01-08 20:51:41
【问题描述】:
假设我想计算一个升余弦。我可以有一个执行#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 作为输入和输出而不复制函数的主体(这是一个简单的示例,但对于更复杂的函数我需要知道这一点)?
编辑:我想我是在问如何制作一个 gentype 函数?只是输入gentype 是行不通的。
【问题讨论】:
-
在你的内核中会有一个
cos_raised版本,还是有多个版本,即同时有一个float2和一个float4版本?如果总是只有一个版本,那么在构建内核时定义一些宏就可以了。 -
什么宏?我们的想法是有一个单一的版本,但让它适用于那些不同的类型。
-
我的意思是,假设您的内核仅在
float cos_raised(floatN x)版本上使用,但在您的程序实际运行之前您不知道floatN将是什么。此方案适用于您将所有函数矢量化以使用相同矢量宽度的情况,但矢量宽度仅在运行时定义。如果是这种情况,您可以使用clBuildProgram的options参数并传递类似"-D floatN=float2"的内容。这样,您的代码中就有了该函数的单一版本,并且它将适用于为floatN输入的任何类型。这够了吗? -
哦,我明白了。这是一个有趣的想法,但不够笼统,因为我可能想把它混为一谈。
标签: opencl vectorization