关于cuda流的一些问题

时间:2017-11-13 15:20:42

标签: cuda gpu-programming

代码:

__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
  3.   

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

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

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

1 个答案:

答案 0 :(得分:1)

在第一点,s1不是默认流。

关于第二点,在小型系统上运行代码,我得到了以下的探查器时间轴。

enter image description here

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