opencl中的平方根和结构

时间:2011-10-18 13:53:54

标签: opencl

我想在我的OpenCL内核中使用两件事,我不知道如何实现/使用。我想最容易回答的是如何使用平方根。我找到的唯一有用的东西是this,但我并没有更明智。我可以只输入hypot(A,B),然后从A²+B²计算平方根吗?如果我想使用双打怎么办?它说我必须使用扩展,但我该如何使用它?

其次我想问的是如何在OpenCL中使用typedef结构,更好,如何传递它? 使其“视觉化”:

我有这个结构,一个非常简单的结构:

typedef struct {
    double x;
    double y;
}Coord;

我想将这些数组传递给我的内核。每个线程都必须使用它获得的全局ID获取自己的x和y。

那么如何确保线程能够做到这一点? :)

提前致谢!

2 个答案:

答案 0 :(得分:1)

要启用双精度的使用,正如您已经指出的那样,您必须指定要在OpenCL代码的开头使用的扩展名(即__kernel所在的位置):

#pragma OPENCL EXTENSION cl_khr_fp64 : enable

执行此操作后,您应该能够使用double2数据类型,这与您的Coord结构相同,但编译器可以理解,因此可以更好地进行优化。 hypot也可以使用双打。

答案 1 :(得分:1)

OpenCL包含一个平方根内置函数“sqrt”(参见OpenCL规范here的第6.11.2节,它是一个重载函数,它接受并返回float,以及float类型的向量(float2,3, 4,8.16),如果通过编译指示启用了cl_chr_fp64扩展名,它也接受双重类型和双重类型的向量。

typedef既可以在OpenCL代码中使用,也可以在宿主代码中使用,也就是在OpenCL中,你可以拥有一个结构数组,就像在C中一样。你需要使用结构数组作为内核的输入在主机代码中,并在内核中声明类型为global Coord* array的内核参数(假设您的数组将驻留在OpenCL全局内存中。

要将global_id用作数组的索引,可以使用get_global_id

返回的值
size_t i = get_global_id(0);
array[i].x = ...