为什么我的代码无法与I/O计算重叠? [英] Why am I not getting I/O-compute overlap with this code?

查看:108
本文介绍了为什么我的代码无法与I/O计算重叠?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下程序:

#include <iostream>
#include <array>

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 = 5e7;
    constexpr const auto num_streams = 2;

    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]);
    }
    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]);
    }
}

应该导致第一流和第二流的工作之间的I/O和计算重叠:当第一流的主机到设备"结束时,第一流的内核可以启动,但是第二流的主机到设备"也可以启动.设备传输.相反,我得到以下时间轴,没有重叠:

should result in overlapping I/O and Compute between the work on the first and second streams: When the first stream's Host-to-Device ends, the first stream's kernel can start, but so can the second stream's Host-to-Device transfer. Instead, I get the following timeline, with no overlap:

思考我已经遮盖了所有基础以确保重叠.这些流是无阻塞的(实际上,入队工作在第一个HtoD之前就已经完成了);主机内存已固定...所以我看不到什么重叠?

I think I've covered my bases to ensure overlap. The streams are non-blocking (and indeed the enqueueing of work concludes well before the first HtoD does); the host memory is pinned... so what's missing for me to see overlap?

在GNU/Linux Mint 18.2上使用CUDA 8.0.61和NVIDIA GTX 650 Ti Boost.但是驱动程序是v384.59.

Using CUDA 8.0.61 on GNU/Linux Mint 18.2 with an NVIDIA GTX 650 Ti Boost. But the driver is v384.59.

推荐答案

好,这一定是我的GPU模型所能解决的,因为有了Fedora 25和GTX Titan X,我会得到:

Ok, it must be something with my GPU model, because with Fedora 25, and a GTX Titan X, I get:

这篇关于为什么我的代码无法与I/O计算重叠?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆