2013-07-07 2 views
1

У меня есть следующая простая программа для тестирования cudaMemsetcudaMemset не кажется, чтобы установить требуемое значение

#include <iostream> 
#include <cuda.h> 
using namespace std; 
__global__ void kernel(int *input){ 
    input[threadIdx.x] += threadIdx.x; 
} 
int main() { 
    size_t size = 5; 
    int *h_ptr, *d_ptr; 
    h_ptr = new int[size]; 

    cudaMalloc((void **)&d_ptr, sizeof(int) * size); 
    cudaMemset(d_ptr, 10, sizeof(int) * size); 

    kernel<<<1, size>>>(d_ptr); 
    cudaDeviceSynchronize(); 

    cudaMemcpy(h_ptr, d_ptr, sizeof(int)*size, cudaMemcpyDeviceToHost); 

    for(int i = 0; i < size; i++) 
      cout<<h_ptr[i]<<" "; 
    cout<<endl; 

    return 0; 
} 

Я ожидал, что результат будет [10 11 12 13 14] вместо этого я получаю значение мусора.

Что мне не хватает?

Спасибо!

ответ

9

cudaMemset работает как стандарт memset Функция, за исключением того, что она предназначена для памяти устройства. Определяет значение каждого байт указанной ячейки памяти. Вы пытаетесь установить значение целое как целое, что невозможно с memset.

В указанном примере, cudaMemset устанавливает значение каждого байта 10. Это означает, что память будет инициализирована как этот

0A0A0A0A0A0A0A...... (в шестнадцатеричном представлении).

Так что, когда вы читаете это как 32-разрядное целое число, вы получите:

168430090 в десятичной

значения не являются мусором, эти ожидаемые результаты.

[168430090 168430091 168430092 168430093 168430094]

+1

написать ядро, которое inizializes вашего массива :) – DRC

+0

Да, ядро ​​инициализации требуется в данном случае. – sgarizvi

+3

См. Также [memset integer array?] (Http://stackoverflow.com/questions/7202411/memset-integer-array) и [cudaMemset() использование] (http://stackoverflow.com/questions/13387101/cudamemset- Применение). – JackOLantern

Смежные вопросы