【问题标题】:Some questions about cuda streams关于 cuda 流的一些问题
【发布时间】:2017-11-15 07:45:07
【问题描述】:

代码:

__global__ void K1() {
    int p=1;
    for(int i=0; i<100000; ++i)
        for(int j=0; j<100000; ++j)
            p*=(i+100)*j;
    printf("K1\n");
}
__global__ void K2() {
    printf("K2\n");
}

int main() {
    int *ptr;
    cudaStream_t s1, s2;
    cudaStreamCreate(&s1);
    cudaStreamCreate(&s2);
    K1<<<1, 1, 0, s1>>>();
    cudaHostAlloc(&ptr, 1, 0);
    K2<<<1, 1, 0, s2>>>();
    cudaDeviceSynchronize();
    return 0;
}

输出:

K2
K1

问题:

  1. s1 是否与默认流相同?
  2. 据此documentation

如果主机线程在它们之间发出以下任一操作,则来自不同流的两个命令不能同时运行:

  • 页面锁定的主机内存分配,

K2 不应该在K1 完成之后开始吗?

【问题讨论】:

  • 据此:docs.nvidia.com/cuda/cuda-c-programming-guide/…,要点 1,K1 不应该在 K2 开始之前完成吗?
  • 我已经根据我的新理解修改了问题。
  • 如果你正在编译一个非调试版本,那么 K1 中的循环将被编译器优化掉。由于多种原因,我认为您的示例无效。
  • @talonmies,这些循环只是为了模拟K1 在时间方面很长的情况。
  • 但这不会是因为编译器只会删除它们

标签: cuda gpu


【解决方案1】:

首先,s1 不是默认流。

关于第二点,在小型系统上运行代码,我得到了以下分析器时间线。

我的理解是内核启动的调度与其实际启动之间存在延迟。这并不奇怪,因为启动与流是异步的。因此,cudaHostAlloc 出现在任何内核启动之前。它发生在内核调用调度之间,但在任何内核调用之前。

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2011-11-10
    • 2018-05-24
    • 2013-07-07
    • 2013-05-10
    • 2012-03-18
    • 2023-03-09
    • 2021-07-01
    • 2011-09-27
    相关资源
    最近更新 更多