чтение данных cuda в пакетном режиме

В настоящее время у меня есть код CUDA, который работает примерно в 3-4 раза медленнее, чем код процессора.

Я удалил все посторонние передачи CPU / GPU, так что большая часть вычислений выполняется на GPU, и только конечный результат передается обратно в память CPU.

Чтобы ускорить процесс, я немного прочитал и выяснил, что, поскольку шина памяти GPU намного медленнее, доступ к памяти устройства GPU также медленный. И так как мои вычисления используют большие массивы — и, следовательно, много обращений к памяти — это замедляет работу, даже когда я устанавливаю threadsPerBlock максимум 1024.

Я полагаю, что единственный вариант, который у меня есть, — это скопировать блоки данных в общую память MP, управляемую каждым отдельным блоком, и выполнить мои вычисления в этой памяти.

Я хочу знать, как наиболее эффективно скопировать часть памяти в пакетном режиме в общую память. Должен ли я сделать это путем копирования индекса начального потока в каждой деформации?

Будем очень благодарны за любые решения с соответствующим кодом или функциями для достижения этой цели!

-1

Решение

Нет такого понятия, как режим серийной съемки. Самая быстрая копия памяти из глобальной в общую память — это просто сделать с потоками:

__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 руководство по передовому опыту есть больше примеров кода о том, как использовать Общая память эффективно ускорить различные операции.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]