Производительность cudaMemcpyToSymbol
У меня есть некоторые функции, которые загружают переменную в постоянную память устройства и запускают функцию ядра. Я заметил, что первый раз, когда одна функция загружает переменную в постоянную память, занимает 0,6 секунды, но следующие загрузки в постоянную память очень быстрые (0,0008 секунды). Такое поведение происходит независимо от того, какая функция является первой в основном. Ниже пример кода:
__constant__ double res1;
__global__kernel1(...) {...}
void function1() {
double resHost = 255 / ((double) size);
CUDA_CHECK_RETURN(cudaMemcpyToSymbol(res1, &resHost, sizeof(double)));
//prepare and launch kernel
}
__constant__ double res2;
__global__kernel2(...) {...}
void function2() {
double resHost = 255 / ((double) size);
CUDA_CHECK_RETURN(cudaMemcpyToSymbol(res2, &resHost, sizeof(double)));
//prepare and launch kernel
}
int main(){
function1(); //takes 0.6 seconds for loading
function2(); // takes 0.0008 seconds for loading
function1(); //takes 0.0008 seconds for loading
return 0;
}
Почему это происходит? Могу ли я избежать этого?
1 ответ
Решение
Почему это происходит?
Ленивое создание и настройка контекста API времени выполнения.
Могу ли я избежать этого?
Нет. При первом вызове API времени выполнения, требующем контекста, будет существенная задержка установки, в вашем случае это первый cudaMemcpyToSymbol
вызов.