memset в cuda, который позволяет устанавливать значения в ядре - PullRequest
0 голосов
/ 21 октября 2011

Я делаю несколько вызовов cudamemset, чтобы установить мои значения в 0, как показано ниже:

void allocateByte( char **gStoreR,const int byte){

    char **cStoreR = (char **)malloc(N * sizeof(char*));

    for( int i =0 ; i< N ; i++){
        char *c;
        cudaMalloc((void**)&c, byte*sizeof(char));

        cudaMemset(c,0,byte);
        cStoreR[i] = c;
    }
    cudaMemcpy(gStoreR, cStoreR, N * sizeof(char *), cudaMemcpyHostToDevice);
}

Однако, это оказывается очень медленным. Есть ли на графическом процессоре функция memset, так как вызов из CPU занимает много времени. Кроме того, cudaMalloc ((void **) & c, byte * sizeof (char)) автоматически устанавливает биты, на которые указывает c, равным 0.

1 Ответ

4 голосов
/ 21 октября 2011

Каждый cudaMemset вызов запускает ядро, поэтому, если N велико, а byte мало, то у вас будет много накладных расходов на запуск ядра, что замедлит код.На стороне устройства нет memset, поэтому решение будет состоять в том, чтобы написать ядро, которое перебирает распределение и обнуляет хранилище за один запуск.

В качестве отступления я настоятельно рекомендую не использовать структурумассивы в CUDA.Управлять этим намного медленнее и сложнее, чем достигать того же результата, используя один большой блок линейной памяти и индексируя в этой памяти.В вашем примере это сократит код до одного cudaMalloc вызова и одного cudaMemset вызова.На стороне устройства медленное перенаправление указателя заменяется несколькими целочисленными операциями, которые выполняются очень быстро.Если ваш исходный материал на хосте представляет собой массив структур, я бы рекомендовал использовать что-то вроде превосходного thrust :: zip_iterator , чтобы получить данные в виде, дружественном к графическому процессору, на устройстве.

...