【问题标题】:Fast way to swap endianness using opencl使用 opencl 交换字节顺序的快速方法
【发布时间】:2013-05-13 20:57:19
【问题描述】:

我正在读取和写入大量 FITS 和 DNG 图像,其中可能包含与我的平台和/或 opencl 设备不同的字节序数据。

目前我会根据需要交换主机内存中的字节顺序,这非常慢并且需要额外的步骤。

有没有一种快速的方法可以将字节顺序错误的 int/float/short 缓冲区传递给 opencl 内核?

使用额外的内核运行来修复字节序是可以的;使用一些无开销的自动修复读/写操作将是完美的。

我知道变量属性 ((endian(host/device))),但这对使用 little endian 设备的 little endian 平台上的 big endian FITS 文件没有帮助。

我想过这样的解决方案(尚未实施或测试):

uint4 mask = (uint4) (3, 2, 1, 0);
uchar4 swappedEndianness = shuffle(originalEndianness, mask);
// to be applied on a float/int-buffer somehow

希望有更好的解决方案。

提前致谢, 运行时错误

【问题讨论】:

    标签: buffer byte opencl endianness


    【解决方案1】:

    当然。由于您有一个 uchar4 - 您可以简单地调整组件并将它们写回。

    output[tid] = input[tid].wzyx;
    

    swizzling 在 SIMD 架构上的性能也非常好,而且成本很低,因此您应该能够将它与内核中的其他操作结合起来。

    希望这会有所帮助!

    【讨论】:

    • 哦 - 我不知何故认为“组件选择语法”只是 OpenGL。你是对的,这应该像一个魅力!
    • 如果你有一个 ushort/uint/ulong 和/或更大的宽度,语法是(对于 ulong,其他类型类似):as_ulong(as_uchar8(value).s76543210)
    【解决方案2】:

    大多数处理器架构在使用指令来完成适合其寄存器宽度(例如 32/64 位宽度)的操作时性能最佳。当 CPU/GPU 执行此类逐字节运算符时,使用下标 .wxyzuchar4,它们需要使用掩码从整数中检索每个字节,移位字节,然后使用整数加法或或运算符到结果.对于字节顺序交换,处理器需要执行上述整数和移位、加/或 4 次,因为有 4 个字节。

    最有效的方法如下

    #define EndianSwap(n) (rotate(n & 0x00FF00FF, 24U)|(rotate(n, 8U) & 0x00FF00FF)
    

    n 可以是任何基因类型,例如,uint4 变量。因为 OpenCL 不允许 C++ 类型重载,所以最好的选择是宏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2012-02-18
      • 2015-05-09
      • 1970-01-01
      相关资源
      最近更新 更多