我有一个使用三个内核的程序。为了获得加速,我做了一个虚拟内存复制来创建一个上下文,如下所示:
__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)
or cudaDevicesynchronize()
。但使用这些 API 调用会比使用虚拟内核带来更糟糕的时间。
强制上下文后,程序的执行时间为0.000031
虚拟内核的秒数和0.000064
cudaDeviceSynchronize() 和 cudaFree(0) 的秒数。时间是程序 10 次单独执行的平均值。
因此,我得出的结论是,启动内核会初始化以规范方式创建上下文时未初始化的内容。
那么,使用内核和使用 API 调用这两种方式创建上下文有什么区别?
我在 GTX480 上运行测试,在 Linux 下使用 CUDA 4.0。
每个 CUDA 上下文都有执行内核所需的内存分配,但不需要分配这些内存来同步、分配内存或释放内存。上下文内存的初始分配和这些分配的大小调整将被推迟,直到内核需要这些资源为止。这些分配的示例包括本地内存缓冲区、设备堆和 printf 堆。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)