Это классический недостаток memset; он работает только с типом данных с 8-битным размером, т.е. char . Это означает, что он устанавливает (вероятно) 3 на каждые 8 битов общей памяти. Вы можете подтвердить это простым кодом C ++:
int main ()
{
int x=16;
size_t bytes = x*sizeof(int);
int *M = (int*)malloc(bytes);
memset(M,3,bytes);
for (int i = 0; i < x; ++i) {
printf("%d\n", M[i]);
}
return 0;
}
Единственный случай, когда memset работает на всех типах данных, это когда вы устанавливаете его в 0. (он устанавливает каждый байт в 0 и, следовательно, все данные в 0). Если вы измените тип данных на char , вы увидите желаемый результат. cudaMemset - это то же самое, что и копия memset, с той лишь разницей, что для ввода требуется указатель GPU.
Таким образом, memset или cudaMemset, вероятно, устанавливают каждый байт в целочисленное значение (в вашем случае 3) всего пространства памяти, определенного третьим аргументом, независимо от типа данных.
Совет:
Google: 50529027 в двоичном виде , и вы получите ответ:)