Я передаю в ядро 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, что означает, что она связана с разделяемой памятью. Полный код здесь
Возможно ли запустить два ядра, 1-й для отправки данных в общую память. Затем, второй, чтобы выполнить вычисления?
Нет, это невозможно. Время существования общей памяти - это блок потока, связанный с этой общей памятью. Блок threadblock не может надежно использовать значения, хранящиеся в другом блоке потоков (будь то из того же самого или другого запуска ядра) в общей памяти.
Единственный способ сохранить данные с одного запуска ядра на следующий - через глобальную память (или память хоста).