将整数传输到设备功能不起作用

时间:2014-06-18 12:30:27

标签: c cuda

对于我的cuda项目,我想给我的设备函数一个整数。 我的功能看起来像

__device__ void  PBKDF2_CUDA(const uint8_t password[], const int pass_len, const uint8_t Essid[], const int Essid_len, const int c, const int dkLen, uint32_t T_ptr[], int *PW_len_test)
{
    uint32_t Hash_ptr[5] = {0};
    uint32_t L[5]={0,0,0,0,0};
    uint32_t T[8] = {0};

    //Maybe working
    /*uint8_t * password_shrinked = (uint8_t*)malloc(8 + 1);
    for(int i = 0; i < 8; i++)
        password_shrinked[i] = password[i];
    password_shrinked[8 + 1] = 0;*/
    int password_len = pass_len;
    if (pass_len != 8)
    {
        *PW_len_test = pass_len;
        password_len = 8;
    }
    uint8_t * password_shrinked = (uint8_t*)malloc(sizeof(uint8_t)*(password_len + 1));
    for (int i = 0; i < password_len; i++)
        password_shrinked[i] = password[i];
    password_shrinked[password_len + 1] = 0;
    //Some other stuff
    free(password_shrinked);
};

我从这样的内核调用它:

__global__ void kernel(uint8_t Password_list[], const int *Password_len, uint8_t Essid[], int *Essid_len, int *rounds,int *dkLen, uint32_t T[], int pmk_size, int *PW_len_test)
{
    int idx= threadIdx.x + blockDim.x*blockIdx.x;
    printf("Password_len is: %d\n", Password_len);
    PBKDF2_CUDA(Password_list+idx*(8), 8, Essid, *Essid_len, *rounds, *dkLen, T+idx*pmk_size, PW_len_test + idx*sizeof(int));
}

在main函数中调用内核:

kernel<<<BLOCKS, THREADS>>>(Pass_d, Pass_len_d, Essid_d, Essid_len_d, rounds_d, key_len_d, PMK_d, PMK_size, PW_len_test_d);

现在,无论我将Pass_len_d设置为8,还是我使用8而不是Pass_len_d调用内核,我的设备函数都会创建垃圾(返回错误的价值观,见下文)。它仅在我在内核函数(如上所示)或设备函数中手动设置值时才有效 使用垃圾我的意思是某些返回值无法从密码列表(uint8_t数组)中正确计算,但其他值已正确计算。每次运行都会正确计算哪些单词的变化,所以我假设某处存在竞争条件,但我找不到它。

1 个答案:

答案 0 :(得分:2)

至少有一个缓冲区溢出。

password_shrinked[password_len + 1] = 0;写入比分配的字节高一个字节的插槽。

请记住,如果分配password_len + 1个字节,则数组中的最后一个位置为password_len