【问题标题】:CUDA context lifetimeCUDA 上下文生命周期
【发布时间】:2013-07-17 06:29:49
【问题描述】:

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

ma​​in.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】:

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

    你应该能够做你想做的事,即只做一次分配(在你的应用程序开始时)和相应的免费操作只做一次(在你的应用程序结束时)并填充@987654321 @memory 只有一次,在第一次使用之前。

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

    【讨论】:

    • 好的。我认为当 cudaFree 或类似的事情发生时,cuda 上下文就结束了。谢谢,我会检查它的进展情况。
    猜你喜欢
    • 2014-11-28
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多