如何解决无法在Cuda内核中使用__m128i
我正在尝试使用cuda编译使用__m128i
的简单程序,但是当我在Linux上使用nvcc(nvcc test.cu -o测试)进行编译时,得到"__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
或其他替代方法。谢谢
解决方法
我想知道在CUDA内核中是否有使用
__m128i
的方法...
没有。 CUDA的native 128 bit integer types具有与__m128i
相同的对齐方式,但是不支持宿主向量类型。
或其他替代方法
如上所述,有16个字节对齐的类型可用于加载和存储数据,但NVIDIA GPU中没有本地的128位SIMD内在支持。存在的SIMD instructions限于32位类型。
CPU SIMD使用短向量(例如128位__m128i
)完成。 GPU SIMD是跨线程完成的,通常不像__m128i
CPU SIMD那样通过软件可见,您只需将其编写为标量代码即可。
使用__m128i
手动矢量化的代码无法为GPU编译。如果它具有标量后备版本,请使用该版本,例如#undef __SSE2__
。
(32位块中的CUDA SIMD使您可以在每个GPU执行单元中的32位宽ALU中获得更多使用,如果您有狭窄的数据,例如成对的16位整数或4个8位整数。因此,如果您的SSE内部代码使用_mm_add_epi8
,您可能仍会受益于CUDA中的手动矢量化,其4x 8位操作代替了16x 8位操作。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。