1
鑑於此CUDA代碼,我試圖執行位移操作,並且這些值的返回值爲零。這不應該發生。有誰知道如何解決這個問題?我是否缺少CUDA頭文件?CUDA中的移位運算符
代碼
__device__ unsigned int FI(unsigned int in_data, unsigned int subkey,
unsigned int *KLi1, unsigned int *KLi2, unsigned int *KOi1, unsigned int *KOi2,
unsigned int *KOi3, unsigned int *KIi1, unsigned int *KIi2, unsigned int *KIi3) {
unsigned int nine, seven;
unsigned int S7[128] = {};
unsigned int S9[512] = {};
nine = (in_data>>7);
seven = (in_data&0x7F);
/* Now run the various operations */
nine = (unsigned int)(S9[nine]^seven);
seven = (unsigned int)(S7[seven]^(nine & 0x7F));
seven ^= (subkey>>9);
nine ^= (subkey&0x1FF);
nine = (unsigned int)(S9[nine]^seven);
seven = (unsigned int)(S7[seven]^(nine & 0x7F));
in_data = (unsigned int)((seven<<9) + nine);
return(in_data);
}
斷點分析
這裏是轉移一個unsigned int 7位到右側的代碼片段的例子。當我在指令中使用cuda-gdb命令和斷點時,我發現移位後的值在它不應該爲零時保持爲零。當我通常在cuda-gdb命令提示符中執行相同的操作時,我得到一個非零值。任何建議或提示?
根據in_data
的值,變量9和7應該是非空的。
nine = (in_data>>7);
seven = (in_data&0x7F);
[Switching focus to CUDA kernel 0, grid 1, block (0,0,0), thread (1,0,0), device 0, sm 0, warp 0, lane 1]
Breakpoint 1, FI (KLi1=0x3fffae0, KLi2=0x3fffb00, KOi1=0x3fffb20, KOi2=0x3fffb40, KOi3=0x3fffb60,
KIi1=0x3fffb80, KIi2=0x3fffba0, KIi3=0x3fffbc0, in_data=461, subkey=0) at kasumiOp.cu:61
61 nine = (in_data>>7);
(cuda-gdb) p in_data
$1 = 461
(cuda-gdb) step
62 seven = (in_data&0x7F);
(cuda-gdb) p nine
$2 = 0
(cuda-gdb) step
65 nine = (unsigned int)(S9[nine]^seven);
(cuda-gdb) p seven
$3 = 0
(cuda-gdb) p 461 >> 7
$4 = 3
(cuda-gdb) cuda thread
thread (1,0,0)
(cuda-gdb) p 561 & 0x7f
$5 = 49
(cuda-gdb) p 461 & 0x7f
$6 = 77
因此,in_data
是一個值。我會嘗試一個微不足道的例子,看看我是否可以重現相同。
CUDA中的移位運算符應該與C的工作方式相同。您可以發佈重現問題的最小大小示例而不是調試會話嗎?你確定'in_data'實際上包含你期望的值嗎? – JackOLantern
你在調試調試版嗎? –
這不是一個可編譯和可執行的完整代碼。只有'__device__'函數,我們不知道'in_data'是如何設置的。 – JackOLantern