cudaMemcpyToSymbol表现

时间:2018-04-14 08:10:19

标签: cuda gpu-programming gpu-constant-memory

我有一些函数可以在常量设备内存中加载变量并启动内核函数。 我注意到第一次将一个变量加载到常量内存中时需要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;
        }

为什么会这样?我可以避免吗?

1 个答案:

答案 0 :(得分:5)

  

为什么会这样?

延迟运行时API上下文建立和设置。

  

我可以避免吗?

没有。对于需要上下文的第一个运行时API调用将导致显着的设置延迟,在您的情况下是第一个cudaMemcpyToSymbol调用。