我想在我的OpenCL内核中使用两件事,我不知道如何实现/使用。我想最容易回答的是如何使用平方根。我找到的唯一有用的东西是this,但我并没有更明智。我可以只输入hypot(A,B),然后从A²+B²计算平方根吗?如果我想使用双打怎么办?它说我必须使用扩展,但我该如何使用它?
其次我想问的是如何在OpenCL中使用typedef结构,更好,如何传递它? 使其“视觉化”:
我有这个结构,一个非常简单的结构:
typedef struct {
double x;
double y;
}Coord;
我想将这些数组传递给我的内核。每个线程都必须使用它获得的全局ID获取自己的x和y。
那么如何确保线程能够做到这一点? :)
提前致谢!
答案 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 = ...