在我的应用程序中,我有一部分代码的工作方式如下
主文件
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
}
对象.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 上下文在我的应用程序中的哪个位置开始和结束,看看是否有一种方法可以只将副本复制到常量内存和内存分配。