【问题标题】:Difference on creating a CUDA context创建 CUDA 上下文的区别
【发布时间】:2012-11-09 18:34:27
【问题描述】:

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

__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。

【问题讨论】:

    标签: cuda nvidia nvcc cuda-context


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-04
      • 2017-08-19
      • 1970-01-01
      • 2020-01-19
      • 2011-09-07
      • 2011-10-12
      • 2019-06-24
      相关资源
      最近更新 更多