CUDA上下文寿命

问题描述 投票:-1回答:1

在我的应用程序中,我有一部分代码,其工作原理如下所示

main.cpp

int main()
{
  //First dimension usually small (1-10)
  //Second dimension (100 - 1500)
  //Third dimension (10000 - 1000000)
  vector<vector<vector<double>>> someInfo;

  Object someObject(...); //Host class

  for (int i = 0; i < N; i++)
     someObject.functionA(&(someInfo[i]));
}

Object.cpp

void SomeObject::functionB(vector<vector<double>> *someInfo)
{
#define GPU 1
#if GPU == 1
    //GPU COMPUTING
    computeOnGPU(someInfo, aConstValue, aSecondConstValue);
#else
    //CPU COMPUTING
#endif
}

Object.cu

extern "C" void computeOnGPU(vector<vector<double>> *someInfo, int aConstValue, int aSecondConstValue)
{
   //Copy values to constant memory

   //Allocate memory on GPU       

   //Copy data to GPU global memory

   //Launch Kernel

   //Copy data back to CPU

   //Free memory
}

所以,正如(我希望)你可以在代码中看到的,准备GPU的函数根据第一个维度的值被多次调用。

所有我发送到常量内存的值总是保持不变,全局内存中分配的指针大小总是相同的(数据是唯一改变的)。

这就是我的代码中的实际工作流程,但是当我使用GPU时,我并没有得到任何加速,我的意思是内核确实执行得更快,但是内存传输成了我的问题(正如nvprof所报告的)。

所以我想知道在我的应用程序中,CUDA上下文在哪里开始和结束,看看是否有办法只做一次拷贝到常量内存和内存分配。

cuda gpgpu cuda-context
1个回答
1
投票

通常情况下,cuda上下文从应用程序中的第一个CUDA调用开始,并在应用程序终止时结束。

你应该可以做到你所想的那样,即只做一次分配(在你的应用开始时),只做一次相应的释放操作(在你的应用结束时),然后填充到 __constant__ 内存只用一次,在第一次使用之前。

如果GPU内存中的数据结构的大小没有变化,就没有必要重复分配和释放它们。

© www.soinside.com 2019 - 2024. All rights reserved.