#c #cuda
#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: %dn", 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), но другие вычисляются правильно. Какие слова правильно вычисляются, меняется при каждом запуске, поэтому я предполагаю, что где-то есть условие гонки, но я не могу его найти.
Комментарии:
1. Выполняете ли вы правильную проверку ошибок cuda? Вы запускали свой код с помощью cuda-memcheck? Были ли сообщения о каких-либо ошибках?
Ответ №1:
По крайней мере, одно переполнение буфера.
password_shrinked[password_len 1] = 0;
записывает в слот на один байт выше того, что было выделено.
Помните, что если вы выделяете password_len 1
байты, последним местоположением в массиве является password_len
.