desempenho de cudaMemcpyToSymbol

Eu tenho algumas funções que carregam uma variável na memória constante do dispositivo e iniciam uma função do kernel. Percebi que a primeira vez que uma função carrega uma variável na memória constante leva 0,6 segundos, mas as próximas cargas na memória constante são muito rápidas (0,0008 segundos). Esse comportamento ocorre independentemente de qual função é a primeira na principal. Abaixo um código de exemplo:

        __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;
        }

Por que isso está acontecendo? Posso evitá-lo?

questionAnswers(1)

yourAnswerToTheQuestion