创建CUDA上下文的区别

时间:2012-11-09 18:34:27

标签: cuda nvidia nvcc

我有一个使用三个内核的程序。为了获得加速,我正在做一个虚拟内存副本来创建一个上下文:

__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​​调用以这两种方式创建上下文的区别是什么?

我在GTX480中运行测试,在Linux下使用CUDA 4.0。

1 个答案:

答案 0 :(得分:3)

每个CUDA上下文都有执行内核所需的内存分配,这些内核不需要分配给syncrhonize,分配内存或释放内存。上下文内存的初始分配和这些分配的大小调整将推迟到内核需要这些资源。这些分配的示例包括本地内存缓冲区,设备堆和printf堆。