Как распечатать size_t в CUDA printf()?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как распечатать size_t в CUDA printf()?

Сообщение Anonymous »

Я написал простой код в своем ядре CUDA для проверки правильности данных:

Код: Выделить всё

#include 

__global__ void testKernel(int *data, int n){
size_t tid = threadIdx.x + blockIdx.x * blockDim.x;
if(tid >= n) return;
int v = data[tid];
if(tid < 8) printf("%d: %d\n", tid, v);
}

int main(){
int n = 128;
auto h_data = new int[n];
for(int i = 0; i < n; i++) h_data[i] = i;

int *d_data;
cudaMalloc((void**)&d_data, sizeof(int) * n);
cudaMemcpy(d_data, h_data, sizeof(int) * n, cudaMemcpyHostToDevice);

testKernel(d_data, n);
cudaDeviceSynchronize();

cudaFree(d_data);
delete[] h_data;
return 0;
}
Вывод приведенного выше кода:

Код: Выделить всё

0: 0
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 0
Очевидно, что значение v неверно. Затем я изменил printf() следующим образом:

Код: Выделить всё

printf("%lu: %d\n", tid, v);
И вывод стал правильным, а именно:

Код: Выделить всё

0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
Я думаю, причина в том, что я использовал неправильный формат для печати типа size_t, но я не знаю, как это произошло.
Кроме того, я попробовал тот же формат печати на процессоре следующим образом:

Код: Выделить всё

for(int i = 0; i < 8; i++){
size_t x = i;
printf("%d: %d\n", x, h_data[i]);
}
/*
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
*/
Результат не показывает никаких ошибок, хотя я использую неправильный формат печати.


Подробнее здесь: https://stackoverflow.com/questions/791 ... uda-printf
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»