Доступ к общей памяти в CUDA

0

Я передаю в ядро 3 массива размером N = 224. Ядро вызывает другую функцию foo (threadIdx.x), а foo вызывает другую функциональную панель (i), где я идет от 1 до 224. Вторая функция должна получить доступ к массивам, переданным ядру, но код, который я сейчас скажу, что аргумент я не определен.

Я попытался сохранить копию массивов в общую память, но это не сработало ::

__global__ void dummy(double *pos_x_d, double *pos_y_d, double *hist_d){

    int i = threadIdx.x;
    hist_d[i]=pos_x_d[i]+pos_y_d[i];
    __syncthreads();

    foo(i);
    __syncthreads();

}

Код хоста выглядит так:

cudaMalloc((void **) &pos_x_d,(N*sizeof(double)));
cudaMalloc((void **) &pos_y_d,(N*sizeof(double)));
cudaMalloc((void **) &hist_d,(N*sizeof(double)));

//Copy data to GPU
cudaMemcpy((void *)pos_x_d, (void*)pos_x_h,N*sizeof(double),cudaMemcpyHostToDevice);
cudaMemcpy((void *)pos_y_d, (void*)pos_y_h,N*sizeof(double),cudaMemcpyHostToDevice);

//Launch Kernel
dummy<<<1,224>>>(pos_x_d,pos_y_d,hist_d);

Возможно ли запустить два ядра, 1-й для отправки данных в общую память. Затем, второй, чтобы выполнить вычисления? Мне также нужно зациклиться на втором ядре, поэтому я хотел сначала отправить данные в разделяемую память. Ошибка исходит из строки 89, 90, что означает, что она связана с разделяемой памятью. Полный код здесь

  • 0
    Время жизни разделяемой памяти ограничено временем жизни блока потоков ядра (AFAIK) p.
  • 0
    @Dominik Selzer Это не работает, когда я использую один поток также. Я вызываю функцию f1, которая вызывает другую функцию f2. ошибка исходит от моего вызова f2, который должен получить доступ к массиву, переданному в ядро.
Показать ещё 5 комментариев
Теги:
cuda
gpgpu

1 ответ

2

Возможно ли запустить два ядра, 1-й для отправки данных в общую память. Затем, второй, чтобы выполнить вычисления?

Нет, это невозможно. Время существования общей памяти - это блок потока, связанный с этой общей памятью. Блок threadblock не может надежно использовать значения, хранящиеся в другом блоке потоков (будь то из того же самого или другого запуска ядра) в общей памяти.

Единственный способ сохранить данные с одного запуска ядра на следующий - через глобальную память (или память хоста).

  • 0
    Это имеет смысл. Должно ли использование cudaMemcpyToSymbol решить мою проблему получения ошибок типа "переменная хоста" pos_x_h "не может быть непосредственно прочитана в функции устройства"? Я определил вызывающую функцию как host____device для безопасности, но это ничего не меняет.
  • 1
    Нет, я не думаю, что это что-то исправит. Я посмотрел на ваш код, в нем, похоже, есть множество ошибок, но я не вижу, где эта конкретная проблема возникнет.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню