В настоящее время у меня есть код CUDA, который работает примерно в 3-4 раза медленнее, чем код процессора.
Я удалил все посторонние передачи CPU / GPU, так что большая часть вычислений выполняется на GPU, и только конечный результат передается обратно в память CPU.
Чтобы ускорить процесс, я немного прочитал и выяснил, что, поскольку шина памяти GPU намного медленнее, доступ к памяти устройства GPU также медленный. И так как мои вычисления используют большие массивы — и, следовательно, много обращений к памяти — это замедляет работу, даже когда я устанавливаю threadsPerBlock
максимум 1024.
Я полагаю, что единственный вариант, который у меня есть, — это скопировать блоки данных в общую память MP, управляемую каждым отдельным блоком, и выполнить мои вычисления в этой памяти.
Я хочу знать, как наиболее эффективно скопировать часть памяти в пакетном режиме в общую память. Должен ли я сделать это путем копирования индекса начального потока в каждой деформации?
Будем очень благодарны за любые решения с соответствующим кодом или функциями для достижения этой цели!
Нет такого понятия, как режим серийной съемки. Самая быстрая копия памяти из глобальной в общую память — это просто сделать с потоками:
__global__ void mykernel(int *globaldata){
__shared__ int localdata[256];
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if (threadIdx.x < 256)
localdata[threadIdx.x] = globaldata[idx];
__syncthreads();
(... rest of kernel code)
}
Если вы запустите вышеупомянутое ядро с не менее 256 тегами на блок (и многими блоками в вашем ядре), вы получите хорошую пропускную способность памяти и использование.
CUDA C руководство по передовому опыту есть больше примеров кода о том, как использовать Общая память эффективно ускорить различные операции.
Других решений пока нет …