CUDA __global__ function 引數分析
在論壇裡面討論到一個問題,__global__函式裡面傳遞的引數,到底是怎麼傳輸到每一個thread的,然後做了以下的一些分析;
這個是問題討論帖子:http://topic.csdn.net/u/20090210/22/2d9ac353-9606-4fa3-9dee-9d41d7fb2b40.html
C/C++ code
__global__ static void HelloCUDA(char* result, int num)
{
__shared__ int i;
i = 0;
char p_HelloCUDA[] = "Hello CUDA!";
for(i = 0; i < num; i++) {
result[i] = p_HelloCUDA[i];
}
}
PTX code
.const .align 1 .b8 __constant432[12] = {0x48,0x65,0x6c,0x6c,0x6f,0x20,0x43,0x55,0x44,0x41,0x21,0x0};
.entry _Z9HelloCUDAPci
{
.reg .u16 %rh<3>;
.reg .u32 %r<16>;
.reg .pred %p<4>;
.param .u32 __cudaparm__Z9HelloCUDAPci_result;
.param .s32 __cudaparm__Z9HelloCUDAPci_num;
.local .align 4 .b8 __cuda___cuda_p_HelloCUDA_168[12];
.shared .s32 i;
.loc 14 15 0
$LBB1__Z9HelloCUDAPci:
mov.u32 %r1, __constant432; //
mov.u32 %r2, __cuda___cuda_p_HelloCUDA_168; //
ld.const.u32 %r3, [%r1+0]; // id:17 not_variable+0x0
st.local.u32 [%r2+0], %r3; // id:18 __cuda___cuda_p_HelloCUDA_168+0x0
ld.const.u32 %r4, [%r1+4]; // id:17 not_variable+0x0
st.local.u32 [%r2+4], %r4; // id:18 __cuda___cuda_p_HelloCUDA_168+0x0
ld.const.u32 %r5, [%r1+8]; // id:17 not_variable+0x0
st.local.u32 [%r2+8], %r5; // id:18 __cuda___cuda_p_HelloCUDA_168+0x0
.loc 14 20 0
mov.s32 %r6, 0; //
ld.param.s32 %r7, [__cudaparm__Z9HelloCUDAPci_num]; // id:16 __cudaparm__Z9HelloCUDAPci_num+0x0
mov.u32 %r8, 0; //
setp.le.s32 %p1, %r7, %r8; //
@%p1 bra $Lt_0_9; //
mov.s32 %r9, %r7; //
mov.u32 %r10, __cuda___cuda_p_HelloCUDA_168; //
mov.u32 %r11, __cuda___cuda_p_HelloCUDA_168; //
add.u32 %r12, %r7, %r11; //
ld.param.u32 %r13, [__cudaparm__Z9HelloCUDAPci_result]; // id:19 __cudaparm__Z9HelloCUDAPci_result+0x0
mov.s32 %r14, %r9; //
$Lt_0_7:
// Loop body line 20, nesting depth: 1, estimated iterations: unknown
.loc 14 21 0
ld.local.s8 %rh1, [%r10+0]; // id:20 __cuda___cuda_p_HelloCUDA_168+0x0
st.global.s8 [%r13+0], %rh1; // id:21
add.u32 %r13, %r13, 1; //
add.u32 %r10, %r10, 1; //
setp.ne.s32 %p2, %r10, %r12; //
@%p2 bra $Lt_0_7; //
st.shared.s32 [i], %r7; // id:22 i+0x0
bra.uni $Lt_0_5; //
$Lt_0_9:
st.shared.s32 [i], %r6; // id:22 i+0x0
$Lt_0_5:
.loc 14 23 0
exit; //
$LDWend__Z9HelloCUDAPci:
} // _Z9HelloCUDAPci
Cubin code
architecture {sm_10}
abiversion {1}
modname {cubin}
consts {
name = __constant432
segname = const
segnum = 0
offset = 0
bytes = 12
mem {
0x6c6c6548 0x5543206f 0x00214144
}
}
code {
name = _Z9HelloCUDAPci
lmem = 12
smem = 28 // 我們注意這裡的smem 的數量
reg = 3
bar = 0
bincode {
0x10000001 0x2400c780 0xd0000001 0x60c00780
0x10000201 0x2400c780 0xd0000801 0x60c00780
0x10000401 0x2400c780 0x307ccbfd 0x6c20c7c8
0xd0001001 0x60c00780 0x10014003 0x00000280
0x1000f801 0x0403c780 0x1000c805 0x0423c780
0x00000005 0xc0000780 0xd4000009 0x40200780
0x20018001 0x00000003 0xd00e0209 0xa0200780
0x3000cbfd 0x6c2147c8 0x20018205 0x00000003
0x1000a003 0x00000280 0x1000ca01 0x0423c780
0x00000c01 0xe4200780 0x30000003 0x00000780
0x00000c01 0xe43f0781
}
}
這個是一段加了shared memory的也有constant 的ptx程式碼~還有cubin
從cubin來看,確實有可能是通過global memory進來的,不過一定是分發到各自的.param變數裡面去的,因為在每一個thread 裡面都是可以修改傳進來的引數的;
從這點來看:大體應該是 引數( global memory--> (constant memory or shared memory) 然後broadcast to each thread--> 每一個thread都各自的register裡面有了引數
大體應該是這樣一個過程;
文章來源:http://blog.csdn.net/OpenHero/archive/2009/02/14/3887086.aspx
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22785983/viewspace-619802/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HRMS Function 引數介紹Function
- ABAP FUNCTION 遠端呼叫的一個引數Function
- stylus_基礎語法(引數/function/運算子)Function
- Ceph配置引數分析
- Dart小知識 -- 函式(Function) && 可選引數(Optional parameters)Dart函式Function
- Oracle引數檔案解析——引數檔案分析獲取Oracle
- CUDA SDK例子分析(2):transpose
- SQL Server效能分析引數 (轉)SQLServer
- SAP IP: 如果自動的進行Planning Function 的引數填充Function
- 硬碟預讀引數變化分析硬碟
- 【7】JVM引數說明和分析JVM
- 淺析SQL Server效能分析引數SQLServer
- flume 寫往hdfs引數理解分析
- 從Function.length 與 Argument.length 區別談到如何傳遞任意個數引數Function
- 【引數】REMOTE_LOGIN_PASSWORDFILE引數三種取值及其行為特性分析REM
- kettle 引數——變數引數和常量引數變數
- C# 中的 in 引數和效能分析C#
- Nagios資料庫引數配置分析iOS資料庫
- 使用SQL來分析資料庫引數(二)SQL資料庫
- JSON.stringify 函式引數分析JSON函式
- CUDA 的隨機數演算法 API隨機演算法API
- Oracle引數-隱藏引數Oracle
- Mybatis(五)--原始碼分析傳入單個list引數和多個list引數寫法MyBatis原始碼
- javascript 中function(){},new function(),new Function(),Function 摘錄JavaScriptFunction
- GET請求引數為中文時亂碼分析
- Guava Cache:核心引數深度剖析和原始碼分析Guava原始碼
- 核心引數導致的備庫當機分析
- CUDA
- 什麼是請求引數、表單引數、url引數、header引數、Cookie引數?一文講懂HeaderCookie
- Swift語言中為外部引數設定預設值可變引數常量引數變數引數輸入輸出引數Swift變數
- c# 方法引數_值引數C#
- c# 方法引數_引用引數C#
- 動態引數,靜態引數
- 成功案例分析 CUDA計算應用無極限
- C#中的值引數,引用引數及輸出引數C#
- Swift學習筆記(三十三)——常量引數,變數引數和inout引數Swift筆記變數
- 爬蟲之-某生鮮APP加密引數逆向分析爬蟲APP加密
- python疑問5:位置引數,預設引數,可變引數,關鍵字引數,命名關鍵字引數區別Python