Передача целого числа в функцию устройства не работает

#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 .