我有一个使用三个内核的程序。为了提高速度,我正在做一个虚拟内存副本来创建一个上下文,如下所示:
__global__ void warmStart(int* f)
{
*f = 0;
}
它在我想计时的内核之前启动,如下所示:
int *dFlag = NULL;
cudaMalloc( (void**)&dFlag, sizeof(int) );
warmStart<<<1, 1>>>(dFlag);
Check_CUDA_Error("warmStart kernel");
我还阅读了其他创建上下文为cudaFree(0)
或cudaDevicesynchronize()
的最简单方法。但是使用这些API调用会比使用虚拟内核带来更糟糕的时间。
强制执行上下文后,程序的执行时间对于虚拟内核为0.000031
秒,对于cudaDeviceSynchronize()和cudaFree(0)均为0.000064
秒。该时间是该程序执行10次的平均值。
因此,我得出的结论是,启动内核会初始化以规范方式创建上下文时未初始化的内容。
所以,使用内核和API调用以这两种方式创建上下文有什么区别?
[我在Linux下使用CUDA 4.0在GTX480中运行测试。
每个CUDA上下文都有执行内核所需的内存分配,而这些内存分配不需要同步,分配内存或释放内存。上下文内存的初始分配和这些分配的大小调整将推迟到内核需要这些资源之前。这些分配的示例包括本地内存缓冲区,设备堆和printf堆。