Endianness和OpenCL传输

Endianness和OpenCL传输,opencl,endianness,Opencl,Endianness,在OpenCL中,从CPU客户端到GPU服务器端的传输是通过clEnqueueReadBuffer…/clEnqueueWriteBuffer…)完成的。。。。但是,文档没有指定是否在底层驱动程序中进行任何与endian相关的转换 我正在开发x86-64和一个NVIDIA卡,它们都是little endian,所以我不会遇到潜在的问题 转换发生了吗,还是我需要自己进行转换?您可以使用clGetDeviceInfo查询设备的endianness并很少检查CL\u device\u Endians\

在OpenCL中,从CPU客户端到GPU服务器端的传输是通过clEnqueueReadBuffer…/clEnqueueWriteBuffer…)完成的。。。。但是,文档没有指定是否在底层驱动程序中进行任何与endian相关的转换

我正在开发x86-64和一个NVIDIA卡,它们都是little endian,所以我不会遇到潜在的问题


转换发生了吗,还是我需要自己进行转换?

您可以使用clGetDeviceInfo查询设备的endianness并很少检查CL\u device\u Endians\u,但我不知道一种允许透明转换的方法。

传输不进行任何转换。运行时不知道数据的类型


您可能只希望在内核参数上进行转换。

这就是INMHO规范不令人满意的地方。 首先,指针是明确的,即指针引用的数据可以是主机或设备字节顺序,可以通过指针属性声明,默认字节顺序是设备的字节顺序。 因此,根据这一点,开发人员必须注意作为内核输入的endianness。 但与附录B“可移植性”相比,据说实现可能会或可能不会自动转换内核参数的endianness,如果主机和设备字节顺序不同,开发人员应该查阅供应商的文档。 对不起,我这么直截了当,那是什么鬼东西。我的意思是,OpenXX规范的目的是使编写跨平台代码成为可能。但是,当不同的实现之间存在显著的差异时,这是不可能的。 下一点是,这对OpenCL/OpenGL互操作意味着什么。
在OpenGL中,缓冲区对象(如VBO)的数据必须按主机字节顺序排列。那么在OpenCL和OpenGL之间共享这样一个缓冲区的情况下会发生什么呢。它的数据是否必须在OpenCL内核处理前后进行转换?

是的,我已经使用过了。这允许人们检查设备的终端,但据我所知,它并没有提到传输数据。你有这方面的来源吗?此外,我认为运行时可以确定数据的类型。您正在传递某种类型的数组,因此理论上驱动程序可以在传输过程中根据需要交换字节。运行时如何知道我的缓冲区有浮点、整数和RGBA像素数据?你推断的智能太多了,根本不需要也不存在。请原谅我的冒昧,但uu kernel void op_uglobal float4*data1,int data2{…}是否意味着它需要一个float4数组和一个int作为参数?@Ian:你可以创建一个缓冲区并在编译内核之前将数据上传到它,因此,在上传过程中不会发生旋转。我想当内核读取或写入数据时,可能会发生swizzle,但我希望规范会对此有所说明。在我上次发表评论后不久,我就意识到了这一点,但当时我离开了计算机。我同意,没有转换可能是正在发生的事情。另见: