Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL矢量数据类型用法_Opencl - Fatal编程技术网

OpenCL矢量数据类型用法

OpenCL矢量数据类型用法,opencl,Opencl,我正在使用一个GPU驱动程序,该驱动程序经过优化,可以处理16个元素的矢量数据类型。 然而,我不知道如何正确使用它 例如,我应该在主机上声明它为cl\u float16,其大小是原始数组的16倍吗 在OpenCL内核上访问此类型的更好方法是什么 提前感谢。在主机代码中,您可以使用cl\u float16主机类型。像数组一样访问它(例如,value.s[5])。作为内核参数传递。在内核中,像value.s5这样的访问在主机上如何声明它几乎是无关紧要的。重要的是您如何分配它,甚至只有在计划使用C

我正在使用一个GPU驱动程序,该驱动程序经过优化,可以处理16个元素的矢量数据类型。 然而,我不知道如何正确使用它

  • 例如,我应该在主机上声明它为
    cl\u float16
    ,其大小是原始数组的16倍吗
  • 在OpenCL内核上访问此类型的更好方法是什么

提前感谢。

在主机代码中,您可以使用
cl\u float16
主机类型。像数组一样访问它(例如,
value.s[5]
)。作为内核参数传递。在内核中,像
value.s5
这样的访问在主机上如何声明它几乎是无关紧要的。重要的是您如何分配它,甚至只有在计划使用CL_MEM_USE_HOST_PTR创建缓冲区并且您的GPU使用系统内存时才是如此。这是因为GPU零拷贝需要正确对齐内存,否则驱动程序将创建后台拷贝。如果您的GPU不使用系统内存作为缓冲区,或者您不使用CL_MEM_use_HOST_PTR,那么这无关紧要-驱动程序将在GPU上分配适当的缓冲区


你更大的问题是你的GPU需要使用16个元素向量。您必须对要在其上运行的每个内核进行矢量化。我们算法的每一部分都需要使用
float16
类型。如果您只使用简单浮点,或者您将缓冲区声明为
global float16*X
,然后使用元素访问(X.s0、X.w等)并使用它们,那么性能将与声明缓冲区
global float*X
时相同-很可能是废话。

谢谢您的回答。那么,你的意思是我必须使用CL_MEM_use_HOST_PTR标志来处理主机内存,对吗?关于对内核上缓冲区的访问:如果我不应该通过元素(X.s0)访问,我应该怎么做?可能是X[index]?您只是将其作为一个简单的缓冲区传递?不,不是作为缓冲区(
clBuffer
),而是作为一个参数传递,比如int。