对于我的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数组)中正确计算,但其他值已正确计算。每次运行都会正确计算哪些单词的变化,所以我假设某处存在竞争条件,但我找不到它。
答案 0 :(得分:2)
至少有一个缓冲区溢出。
password_shrinked[password_len + 1] = 0;
写入比分配的字节高一个字节的插槽。
请记住,如果分配password_len + 1
个字节,则数组中的最后一个位置为password_len
。