【发布时间】:2013-02-04 05:27:19
【问题描述】:
我想知道是否可以在 GPU 代码中使用 SIMD 内在函数,例如 CUDA 内核或 openCL 内核。这可能吗?
【问题讨论】:
我想知道是否可以在 GPU 代码中使用 SIMD 内在函数,例如 CUDA 内核或 openCL 内核。这可能吗?
【问题讨论】:
不,SIMD 内部函数只是 ASM 代码的微小包装。它们是特定于 CPU 的。更多关于他们的信息here。
一般来说,你为什么要这样做? CUDA 和 OpenCL 已经包含许多实际上是“GPU 内在函数”的“函数”(例如,所有这些函数都是 single-point-math intrinsics for the GPU)
【讨论】:
您使用 OpenCL C 语言中内置的矢量数据类型。例如 float4 或 float8。如果您使用 Intel 或 AMD 设备驱动程序运行,这些应转换为供应商 OpenCL 设备驱动程序的 SSE/AVX 指令。 OpenCL 包括几个函数,例如 dot(v1, v2) 应该使用 SSE/AVX 点生成指令。是否有您认为无法从 OpenCL C 语言中获得的特定内在特性?
【讨论】:
大多数情况下不会,因为 GPU 编程语言使用不同的编程模型 (SIMT)。但是,AMD GPU do have an extension to OpenCL 为某些字节粒度操作提供了内在函数(因此允许将 4 个值打包到 32 位 GPU 寄存器中)。这些操作用于视频处理。
【讨论】:
是的,您可以在 CPU 或 GPU 的内核代码中使用 SIMD 内部函数,前提是编译器支持使用这些内部函数。
通常使用 SIMD 的更好方法是在内核中使用 Vector 数据类型,以便编译器根据可用性决定使用 SIMD,这也使内核代码具有可移植性。
【讨论】: