CUDA上下文生存期



在我的应用程序中,我有如下所示的部分代码

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]));
}

对象.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上下文从应用程序中的第一个cuda调用开始,并在应用程序终止时结束。

你应该能够做你想做的事情,即只做一次分配(在你的应用程序开始时),只进行一次相应的免费操作(在你应用程序结束时),并在第一次使用__constant__内存之前只填充一次。

如果GPU内存中的数据结构的大小不变,则无需重复分配和释放它们。

相关内容

  • 没有找到相关文章

最新更新