【发布时间】:2020-12-09 16:54:30
【问题描述】:
我正在尝试使用 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 内核中使用 __m128i 或其他替代方法。谢谢
【问题讨论】:
-
@TedLyngmo:那篇文章谈到了 GNU C
__uint128_t,它与__m128i完全无关,只是大小相同。 SSE 整数向量不是 128 位整数类型;最宽的元素大小是_mm_add_epi64。 (除非您只使用按位布尔运算,否则元素边界无关紧要。) -
@TedLyngmo:但
__m128i不是a 128 位整数;这是一个 SIMD 向量。在 GNU C 中,定义为typedef long long __m128i __attribute__((vector_size(16), may_alias))。拥有受 CUDA 支持的标量 128 位整数类型不会帮助您编译使用__m128i和_mm_shuffle_epi32、_mm_add_epi32等内在函数的代码(将其视为 4x 32 位整数的向量) ,或_mm_minpos_epu16(16 位无符号元素的水平最小和最小位置),或其他 SSE 硬件操作。您不能将__m128i用作单个 128 位整数,因此这不是 OP 想要的。 -
@PeterCordes 啊......现在我明白你在说什么了。 :) 对困惑感到抱歉。删除评论。
标签: c++ cuda intrinsics nvcc