cudaMemcpyToSymbol 性能
cudaMemcpyToSymbol performance
我有一些函数可以在常量设备内存中加载变量并启动内核函数。
我注意到一个函数第一次在常量内存中加载变量需要 0.6 秒,但常量内存的下一次加载非常快(0.0008 秒)。
无论哪个函数是 main 中的第一个函数,都会发生此行为。
下面是一个示例代码:
__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;
}
为什么会这样?我能避免吗?
Why is this happening?
惰性运行时API 上下文建立和设置。
Can I avoid it?
没有。需要上下文的第一个运行时 API 调用会导致显着的设置延迟,在您的情况下是第一个 cudaMemcpyToSymbol
调用。
我有一些函数可以在常量设备内存中加载变量并启动内核函数。 我注意到一个函数第一次在常量内存中加载变量需要 0.6 秒,但常量内存的下一次加载非常快(0.0008 秒)。 无论哪个函数是 main 中的第一个函数,都会发生此行为。 下面是一个示例代码:
__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;
}
为什么会这样?我能避免吗?
Why is this happening?
惰性运行时API 上下文建立和设置。
Can I avoid it?
没有。需要上下文的第一个运行时 API 调用会导致显着的设置延迟,在您的情况下是第一个 cudaMemcpyToSymbol
调用。