Разница в создании контекста 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.

Другие вопросы по тегам