繁体   English   中英

不能在 Cuda kernel 中使用 __m128i

[英]Can't use __m128i in Cuda kernel

我正在尝试使用 cuda 编译一个使用__m128i的简单程序,但是当我在 Linux 上使用 nvcc (nvcc test.cu -o test) 进行编译时,我得到"__m128i" is a vector, which is not supported in device code 这是我要编译的程序

#include <stdio.h>
#include <emmintrin.h>

__global__ void hello(){
    printf("%d\n",threadIdx.x);
    __m128i x;

}
int main(){
   hello<<<3,3>>>();
}

当我输入nvcc --version时,我得到Cuda compilation tools, release 10.2, V10.2.89

实际上,我在尝试使用 CUDA 实现一些 cpp 代码时更大规模地遇到了这个问题,而这个 cpp 代码使用__m128i ,我所展示的是我所面临问题的简单版本,所以我想知道是否有办法在 CUDA kernel 或其他替代方案中使用__m128i 谢谢

我想知道是否有办法在 CUDA __m128i中使用 __m128i ...

那没有。 CUDA 具有原生 128 位 integer 类型,它们满足与 __m128i 相同的__m128i属性,但不支持宿主向量类型。

或其他一些替代方案

如上所述,有 16 字节对齐类型可用于加载和存储数据,但 NVIDIA GPU 中没有原生 128 位 SIMD 内在支持。 现有的那些SIMD 指令仅限于 32 位类型。


CPU SIMD 使用 128 位__m128i等短向量完成。 GPU SIMD 是跨线程完成的,并且通常不像__m128i CPU SIMD 那样对软件可见,您只需将其编写为标量代码。

无法为 GPU 编译使用__m128i手动矢量化的代码。 如果它有一个标量后备版本,请使用它,例如#undef __SSE2__

(32 位块内的 CUDA SIMD 可以让您在每个 GPU 执行单元中更多地使用 32 位宽 ALU,如果您有窄数据,例如 16 位整数对或 4x 8 位整数。所以如果您SSE 内在代码使用_mm_add_epi8 ,您可能仍会受益于 CUDA 中的手动矢量化,其 4x 8 位操作而不是 16x 8 位。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM