0

Nsight Visual Profile 生成的时间线看起来很奇怪。我没有写任何传输重叠的代码,但是你可以看到MemCpyCompute内核之间的重叠。

这使我无法调试真正的重叠代码。

我使用 CUDA 5.0、Tesla M2090、Centos 6.3、2x CPU Xeon E5-2609

有人有类似的问题吗?它只发生在某些 linux 发行版上吗?如何解决?

这是代码。

#include <cuda.h>
#include <curand.h>
#include <cublas_v2.h>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/device_ptr.h>

int main()
{
    cublasHandle_t hd;
    curandGenerator_t rng;
    cublasCreate(&hd);
    curandCreateGenerator(&rng, CURAND_RNG_PSEUDO_MTGP32);

    const size_t m = 5000, n = 1000;
    const double alpha = 1.0;
    const double beta = 0.0;

    thrust::host_vector<double> h(n * m, 0.1);
    thrust::device_vector<double> a(m * n, 0.1);
    thrust::device_vector<double> b(n * m, 0.1);
    thrust::device_vector<double> c(m * m, 0.1);
    cudaDeviceSynchronize();

    for (int i = 0; i < 10; i++)
    {
        curandGenerateUniformDouble(rng,
                thrust::raw_pointer_cast(&a[0]), a.size());
        cudaDeviceSynchronize();

        thrust::copy(h.begin(), h.end(), b.begin());
        cudaDeviceSynchronize();

        cublasDgemm(hd, CUBLAS_OP_N, CUBLAS_OP_N,
                m, m, n, &alpha,
                thrust::raw_pointer_cast(&a[0]), m,
                thrust::raw_pointer_cast(&b[0]), n,
                &beta,
                thrust::raw_pointer_cast(&c[0]), m);
        cudaDeviceSynchronize();
    }

    curandDestroyGenerator(rng);
    cublasDestroy(hd);

    return 0;
}

这是捕获的配置文件时间线。

时间线

4

1 回答 1

1

计算能力 2.* (Fermi) 设备能够同时实现内核级并发以及内核和复制并发。为了跟踪并发内核,内核开始和结束时间戳被收集在与内存复制时间戳不同的时钟域中。该工具负责关联这些不同的时钟。在您的屏幕截图中,我相信存在不同的缩放因子(相关性不好),因为您可以看到每个内存副本都不是由一个常数值关闭,而是由一个缩放的偏移量关闭。

如果您使用--concurrent-kernels offnvprof 中的选项,我认为问题将消失。当并发内核被禁用时,内存复制和内核时序使用相同的源时钟作为时间戳。

Compute Capability 3.* (Kepler) 和 5.* (Maxwell) 具有不同的计算内核计时机制。对于这些设备,可以在工具中看到与内核的结束时间戳和内存副本或内核的开始重叠。工作不重叠。工具中有一个设计决策,即具有重叠的潜力(通常<500ns)或将其作为依赖工作之间的恒定开销引入。这些工具决定避免引入开销,代价是可能在序列化工作上表现出非常小的重叠。

于 2016-02-09T22:05:10.093 回答