CUDA設備上的類型尺寸在理論上可能與主機平臺上的尺寸不同。那麼,在代碼中表達「sizeof(T)在我的CUDA設備上」的慣用方式是什麼?除了將自己的id類型地圖滾動到您知道的值之外?「我的CUDA設備上的sizeof type T」的成語是什麼?
0
A
回答
2
您在任何目前支持的CUDA平臺上都沒有詢問您需要什麼。 CUDA工具鏈與主機編譯器和主機C++運行時庫如此高度集成的原因之一是,保證主機和設備上基本類型的大小始終匹配。沒有大小的慣用翻譯是必需的。對於主機和設備,sizeof
的結果將始終相同。請注意,基礎類型的大小可能因平臺而異(Windows是LLP64/IL32P64平臺,Linux和OS X是LP64/I32LP64平臺),但對GPU沒有影響。
還要注意,GPU可以對複合類型施加對齊要求,這可能意味着編譯的大小與您所期望的不同。文件中詳細討論了適用條件。
例如,請考慮下面簡單的例子代碼:
#include <cstdio>
__device__ __host__ __noinline__ void printsizes(const char* title)
{
printf("%s\n", title);
printf("sizeof(void*) = %ld\n", (unsigned long)sizeof(void*));
printf("sizeof(char) = %ld\n", (unsigned long)sizeof(char));
printf("sizeof(bool) = %ld\n", (unsigned long)sizeof(bool));
printf("sizeof(short) = %ld\n", (unsigned long)sizeof(short));
printf("sizeof(int) = %ld\n", (unsigned long)sizeof(int));
printf("sizeof(long) = %ld\n", (unsigned long)sizeof(long));
printf("sizeof(long long) = %ld\n", (unsigned long)sizeof(long long));
}
__global__ void printkernel()
{
printsizes("On the device:");
}
int main()
{
printsizes("On the host:");
printkernel<<<1,1>>>();
cudaDeviceSynchronize();
cudaDeviceReset();
return 0;
}
編譯並在Linux 64平臺的產量運行此:
$ nvcc -arch=sm_52 -m64 -o sizeof64 sizeof.cu
$ ./sizeof64
On the host:
sizeof(void*) = 8
sizeof(char) = 1
sizeof(bool) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 8
sizeof(long long) = 8
On the device:
sizeof(void*) = 8
sizeof(char) = 1
sizeof(bool) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 8
sizeof(long long) = 8
內置64位Windows平臺上它產生這樣的:
>nvcc -arch=sm_21 -m64 sizes.cu
sizes.cu
Creating library a.lib and object a.exp
>a.exe
On the host:
sizeof(void*) = 8
sizeof(char) = 1
sizeof(bool) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 4
sizeof(long long) = 8
On the device:
sizeof(void*) = 8
sizeof(char) = 1
sizeof(bool) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 4
sizeof(long long) = 8
基於32位Windows平臺,它產生了這樣的結果:
>nvcc -arch=sm_21 -m32 sizes.cu
sizes.cu
Creating library a.lib and object a.exp
C:\Users\david\Documents>a.exe
On the host:
sizeof(void*) = 4
sizeof(char) = 1
sizeof(bool) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 4
sizeof(long long) = 8
On the device:
sizeof(void*) = 4
sizeof(char) = 1
sizeof(bool) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 4
sizeof(long long) = 8
請注意,void *
和long
的大小可能因平臺而異。但是在任何情況下,GPU尺寸都與主機尺寸相匹配。這是CUDA驅動程序和GPU運行時的基本設計原則。
相關問題
- 1. 爲什麼sizeof ...(T)這麼慢?實現C++ 14 make_index_sequence沒有...的sizeof(T)
- 2. sizeof(value)vs sizeof(type)?
- 3. 是否保證sizeof(T [N])== N * sizeof(T)?
- 4. sizeof(char *)是做什麼的?
- 5. 我是否有保證sizeof(type)== sizeof(無符號類型)?
- 6. EclipseLink上的Hibernate對應的@Type(type =「yes_no」)是什麼?
- 7. 什麼的sizeof管
- 8. 爲什麼按'add_rvalue_reference <T> :: type'而不是'T &&'指定'declval'?
- 9. 什麼是CUDA上下文?
- 10. 在[Soap getNodeValue:element withName:@「type」]中,@「type」是什麼; Sudzc生成的代碼
- 11. 爲什麼sizeof(a)16? (sizeof int是4)
- 12. Python中的'type'是什麼?
- 13. systype中的'type'是什麼?
- 14. 成員初始值設定項中使用的sizeof的行爲是什麼?
- 15. CUDA設備到設備轉移昂貴
- 16. sizeof(int)* p在語義上是什麼意思?
- 17. 什麼是CUDA
- 18. CUDA:爲什麼compute_20代碼在compute_35設備上失敗?
- 19. 什麼是HttpCallback <T>中的目的和什麼是T?
- 20. CUDA - 爲什麼我的設備數據沒有傳輸到主機?
- 21. 在CUDA設備上生成均勻的雙隨機數
- 22. 爲什麼這不是從設備複製到Cuda主機?
- 23. 什麼是ContactsContract.Groups.ACCOUNT_NAME/TYPE?
- 24. T的類型是什麼?
- 25. IEnumerable中的Type參數是什麼<T> .Intersect <T>呢?
- 26. 支持CUDA的設備
- 27. 設備與CUDA的分裂
- 28. SCD Type 2的T-SQL語法
- 29. 爲什麼我的程序在我的CPU設備上運行得比在我的GPU設備上快得多?
- 30. mysqli準備好的語句是什麼?
CUDA運行時已專門設計,以便主機和設備類型的大小相匹配。所以不,他們理論上不可能在大小上有所不同。唯一的角落案例是結構對齊,甚至是一致的。 – talonmies
@talonmies,你確認cuda改變了bool的大小嗎?如果是的話,你記得什麼時候?哪個版本?其餘的,我完全同意,基本的(T)檢查尺寸應該適合大多數需求。 –
@talonmies:但[LP64 vs LLP64編譯器](https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models)呢? – einpoklum