2014-06-10 52 views
-2

我想要寫在CUDA一個SHA1-功能,但是當我執行的功能,我得到錯誤的結果出來的功能。當我在CPU上運行相同的功能時,我會得到正確的結果。我的SHA-功能樣子:CUDA SHA-計算失敗

__device__ void SHA1_CUDA(uint8_t input_string[], int slen, uint32_t Hash_ptr[]) 
{ 
    printf("Input string is %s, input len is %d\n", input_string, slen); 
    uint32_t K[80]; 
    uint32_t A,B,C,D,E,TEMP; 
    int r,k,ln,t,l,i,j; 

    Hash_ptr[0]=0x67452301; 
    Hash_ptr[1]=0xefcdab89; 
    Hash_ptr[2]=0x98badcfe; 
    Hash_ptr[3]=0x10325476; 
    Hash_ptr[4]=0xc3d2e1f0; 

    ln=slen; 
    r = (int)((ln+1)/64); 

    if (((ln+1) % 64) > 56) 
     { 
     r=r+1; 
     } 

    // initialize Constants 

    for(t=0; t<80; t++) 
     { 
      if (t<20) 
       { 
        K[t] = 0x5a827999; 
       } 

      if ((t>19)&(t<40)) 
       { 
        K[t] = 0x6ED9EBA1; 
       } 
      if ((t>39)&(t<60)) 
       { 
        K[t] = 0x8F1BBCDC; 
       } 
      if (t>59) 
       { 
        K[t] = 0xca62c1d6; 
       } 
     } 

    for(l=0; l <= r; l++) 
    { 
     uint32_t W[80]={0}; 
     //Initialize Text 
     for (i=0; i<16; i++) 
      { 
      for(j=0; j<4; j++) 
       { 
        if (4*i+j <= ln) 
        { 
         k = input_string[64*l+4*i+j]; 
        } 
        else 
        { 
         k =0; 
        } 

        if (k<0) 
        { 
         k = k +256; 
        } 

        if (4*i+j == ln) 
         { 
          k = 0x80; 
         } 

    //    W[i]= W[i] + k*(uint32_t)pow(256,(double)3-j); 
        W[i]= W[i] + k*expo_d[3-j]; 
       } 
      } 
     if ((W[14]==0)&(W[15]==0)) 
     { 
      W[15]=8*slen; 
     } 

    // Hash Cycle 


     for (t = 16; t <80; t++) 
      { 
       W[t] = Rol(W[t-3]^W[t-8]^W[t-14]^W[t-16],1); 
      } 

     A = Hash_ptr[0]; 
     B = Hash_ptr[1]; 
     C = Hash_ptr[2]; 
     D = Hash_ptr[3]; 
     E = Hash_ptr[4]; 


     for(t = 0; t < 80; t++) 
     { 
      TEMP = (Rol(A,5) + f(B,C,D,t) + E + W[t] + K[t]); 
      E = D; 
      D = C; 
      C = Rol(B,30); 
      B = A; 
      A = TEMP; 
     } 

     Hash_ptr[0] = Hash_ptr[0] + A; 
     Hash_ptr[1] = Hash_ptr[1] + B; 
     Hash_ptr[2] = Hash_ptr[2] + C; 
     Hash_ptr[3] = Hash_ptr[3] + D; 
     Hash_ptr[4] = Hash_ptr[4] + E; 

     ln = ln - 64; 
    } 

} 

(主機功能是類似的,只有__host__代替__device__)。 我的內核函數是

__global__ void test_sha(uint8_t pw[], int* pw_len, uint32_t H[]) 
{ 
    SHA1_CUDA(pw, *pw_len, H); 
} 

,我稱它像

printf("\nTesting SHA\n"); 
    uint32_t * H_h = (uint32_t*)malloc(sizeof(uint32_t)*5); 
    memset(H_h, 0, sizeof(uint32_t) * 5); 
    uint32_t * H_d; 
    cudaMalloc(&H_d, sizeof(uint32_t)*5); 
    cudaMemcpy(H_d, H_h, 5*sizeof(uint32_t), cudaMemcpyHostToDevice); 
    test_sha<<<1, 1>>>(Pass_d, Pass_len_d, H_d); 
    cudaMemcpy(H_h, H_d, 5*sizeof(uint32_t), cudaMemcpyDeviceToHost); 
    cudaFree(H_d); 
    for(int i = 0; i < 5; i++) 
     printf("%x ", H_h[i]); 
    printf("\n\n"); 
    printf("Comparing to CPU: \n"); 
    SHA1_CUDA_h(Pass_h, Pass_len, H_h); 
    for(int i = 0; i < 5; i++) 
     printf("%x ", H_h[i]); 
    printf("\n\n"); 
    free(H_h); 

所以,我printf - 函數的SHA-功能告訴我,一切都已經正確傳輸,但儘管如此,我得到錯誤的結果...
哪裏是我的錯?

+2

這將是有益的,有一個最低大小的代碼,別人可以複製,粘貼,編譯並運行。另外,最好知道什麼是預期的結果,以及你得到什麼錯誤。最後,如果您可以提供最低限度的框架,對其他用戶也是有益的。 「SHA」不會告訴我任何不同的安全散列算法。 – JackOLantern

+0

代碼位於http://pastebin.com/h3tXSjVg。該SHA-函數總是返回'ce8a4602 5712ce8a 3175b9fc a8ed3174 5c8dbeee'無論輸入的。 –

+0

好吧,我的問題是我使用了一個壞ROL功能...對不起,我的錯... –

回答

1

問題解決,ROL功能Rol_CUDA我是用我的函數返回錯誤值,因此任何人,除非我可以解決這個問題。
大家誰想要使用此功能:在上線引擎收錄51,應該有一個32-y,而不是-y。有了這個校正一切正常。

+0

你有更好的答案,包括上面的信息的建議? –

+0

@talonmies對不起,我負責downvote。不過,我意識到,我錯誤地低估了這個答案。 「誤解」是因爲我同意你的觀點,鼓勵從未答覆的列表中刪除未答覆的帖子。我道歉。不過,我同意@PaperBirdMaster @arc_lupus可能會花更多的關於這個問題的話。例如,「Rol_CUDA」函數有什麼錯誤和/或如何修復它。 – JackOLantern