Cuda 探查器是否错误,或者日程安排是否混乱,或者两者都有?

Cuda 探查器是否错误,或者日程安排是否混乱,或者两者都有?,cuda,cuda-streams,Cuda,Cuda Streams,考虑以下计划: #include <iostream> #include <array> #include <unistd.h> using clock_value_t = long long; __device__ void gpu_sleep(clock_value_t sleep_cycles) { clock_value_t start = clock64(); clock_value_t cycles_elapsed; d

考虑以下计划:

#include <iostream>
#include <array>
#include <unistd.h>

using clock_value_t = long long;

__device__ void gpu_sleep(clock_value_t sleep_cycles)
{
    clock_value_t start = clock64();
    clock_value_t cycles_elapsed;
    do { cycles_elapsed = clock64() - start; }
    while (cycles_elapsed < sleep_cycles);
}

__global__ void dummy(clock_value_t duration_in_cycles)
{
    gpu_sleep(duration_in_cycles);
}

int main()
{
    const clock_value_t duration_in_clocks = 1e7;
    const size_t buffer_size = 2e7;
    constexpr const auto num_streams = 8;

    std::array<char*, num_streams> host_ptrs;
    std::array<char*, num_streams> device_ptrs;
    std::array<cudaStream_t, num_streams> streams;
    for (auto i=0; i<num_streams; i++) {
        cudaMallocHost(&host_ptrs[i], buffer_size);
        cudaMalloc(&device_ptrs[i], buffer_size);
        cudaStreamCreateWithFlags(&streams[i], cudaStreamNonBlocking);
    }
    cudaDeviceSynchronize();
    for (auto i=0; i<num_streams; i++) {
        cudaMemcpyAsync(device_ptrs[i], host_ptrs[i], buffer_size, cudaMemcpyDefault, streams[i]);
        dummy<<<128, 128, 0, streams[i]>>>(duration_in_clocks);
        cudaMemcpyAsync(host_ptrs[i], device_ptrs[i], buffer_size, cudaMemcpyDefault, streams[i]);
    }
    usleep(50000);
    for (auto i=0; i<num_streams; i++) { cudaStreamSynchronize(streams[i]); }
    for (auto i=0; i<num_streams; i++) {
        cudaFreeHost(host_ptrs[i]);
        cudaFree(device_ptrs[i]);
    }
}
#包括
#包括

这张照片有几个地方不对劲:

  • 据我回忆,一次只能进行一次HtoD转移
  • 所有的内存传输需要的时间基本相同——它们的数据量相同;PCIe总线对传输速率的影响如此之大,没有其他有趣的事情发生
  • 有些DtoH条就像是在另一条溪流上发生了什么事情之前一直伸展着
  • 这里有一个巨大的缺口,似乎没有计算机,也没有真正的I/O。即使之前完成的所有内核的DtoH都占据了这个缺口,这仍然会留下非常长的时间。这实际上看起来像是一个调度问题,而不是一个分析错误
那么,我应该如何解释这个时间线呢?问题出在哪里?(希望不是程序员……)

我应该提到的是,对于较少的流(例如2),时间线在相同的软件+硬件上看起来非常好: