Разница в создании контекста CUDA
У меня есть программа, которая использует три ядра. Чтобы получить ускорения, я делал фиктивную копию памяти, чтобы создать контекст следующим образом:
__global__ void warmStart(int* f)
{
*f = 0;
}
который запускается до ядра я хочу, чтобы время следующим образом:
int *dFlag = NULL;
cudaMalloc( (void**)&dFlag, sizeof(int) );
warmStart<<<1, 1>>>(dFlag);
Check_CUDA_Error("warmStart kernel");
Я также читал о других простейших способах создания контекста как cudaFree(0)
или же cudaDevicesynchronize()
, Но использование этих вызовов API дает худшие времена, чем использование фиктивного ядра.
Время выполнения программы после форсирования контекста 0.000031
секунды для фиктивного ядра и 0.000064
секунд для обоих, cudaDeviceSynchronize() и cudaFree(0). В среднем было получено 10 отдельных исполнений программы.
Поэтому я пришел к выводу, что запуск ядра инициализирует что-то, что не инициализируется при создании контекста каноническим способом.
Итак, в чем разница создания контекста этими двумя способами, используя ядро и вызов API?
Я запускаю тест в GTX480, используя CUDA 4.0 под Linux.
1 ответ
Каждый контекст CUDA имеет выделения памяти, которые требуются для выполнения ядра, которые не требуется выделять для синхронизации, выделения памяти или свободной памяти. Первоначальное выделение контекстной памяти и изменение размера этих выделений откладывается до тех пор, пока ядру не потребуются эти ресурсы. Примеры этих распределений включают буфер локальной памяти, кучу устройства и кучу printf.