2014-06-10 54 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