Windows上的重叠计算和传输

问题描述 投票:0回答:1

当尝试在Windows上重叠计算和传输时(使用VS2015和CUDA 10.1),我遇到了一些问题。该代码根本不重叠。但是Linux上的代码与预期行为完全相同。

这里是NVVP的观点:

Windows 10 NVVP屏幕截图:

NVVP screenshot on Win10/VS2015

Linux NVVP屏幕截图:

NVVP screenshot on Linux

请注意以下几点:

  • 我的主机内存是PageLocked
  • 我正在使用两个不同的流
  • 我正在使用cudaMemcpyAsync方法在主机和设备之间传输
  • 如果我在Linux上运行我的代码,一切都很好
  • 我在文档中看不到任何描述这两个系统之间不同行为的内容。

所以问题如下:

我想念什么吗?是否存在在此配置上实现重叠的方法(Windows 10 + 1080Ti)?


您可以在此处找到一些代码来重现此问题:

#include "cuda_runtime.h"

constexpr int NB_ELEMS = 64*1024*1024;
constexpr int BUF_SIZE = NB_ELEMS * sizeof(float);

constexpr int BLK_SIZE=1024;

using namespace std;

__global__
void dummy_operation(float* ptr1, float* ptr2)
{
    const int idx = threadIdx.x + blockIdx.x * blockDim.x;
    if(idx<NB_ELEMS)
    {
        float value = ptr1[idx];
        for(int i=0; i<100; ++i)
        {
            value += 1.0f;
        }

        ptr2[idx] = value;
    }
}


int main()
{
    float *h_data1 = nullptr, *h_data2 = nullptr,
        *h_data3 = nullptr, *h_data4 = nullptr;
    cudaMallocHost(&h_data1, BUF_SIZE);
    cudaMallocHost(&h_data2, BUF_SIZE);
    cudaMallocHost(&h_data3, BUF_SIZE);
    cudaMallocHost(&h_data4, BUF_SIZE);

    float *d_data1 = nullptr, *d_data2 = nullptr,
        *d_data3 = nullptr, *d_data4 = nullptr;

    cudaMalloc(&d_data1, BUF_SIZE);
    cudaMalloc(&d_data2, BUF_SIZE);
    cudaMalloc(&d_data3, BUF_SIZE);
    cudaMalloc(&d_data4, BUF_SIZE);

    cudaStream_t st1, st2;
    cudaStreamCreate(&st1);
    cudaStreamCreate(&st2);

    const dim3 threads(BLK_SIZE);
    const dim3 blocks(NB_ELEMS / BLK_SIZE + 1);

    for(int i=0; i<10; ++i)
    {
        float* tmp_dev_ptr = (i%2)==0? d_data1 : d_data3;
        float* tmp_host_ptr = (i%2)==0? h_data1 : h_data3;
        cudaStream_t tmp_st = (i%2)==0? st1 : st2;
        cudaMemcpyAsync(tmp_dev_ptr, tmp_host_ptr, BUF_SIZE, cudaMemcpyDeviceToHost, tmp_st);
        dummy_operation<<<blocks, threads, 0, tmp_st>>>(tmp_dev_ptr, d_data2);
        //cudaMempcyAsync(d_data2, h_data2);
    }

    cudaStreamSynchronize(st1);
    cudaStreamSynchronize(st2);

    return 0;
}
cuda
1个回答
0
投票

如@talonmies所指出,要重叠计算和传输,您需要在Tesla Compute Cluster模式下使用图形卡。

我已经使用旧的Quadro P620检查了此行为。

© www.soinside.com 2019 - 2024. All rights reserved.