簡體   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