gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:41 24 4
gpt4 key购买 nike

对于我的 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));
}

在主函数中调用内核:

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 数组)正确计算,但其他值计算正确。每次运行时正确计算的单词都会发生变化,因此我假设某处存在竞争条件,但我找不到它。

最佳答案

至少有一处缓冲区溢出。

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

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

关于c - 将整数传输到设备功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24285671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com