2015-10-14 42 views
-1

我试图计算在GPU计算的东西所花的总时间。我使用cudaEventRecord和cudaEventElapsedTime来确定这一点,但我有一个意想不到的行为,或者至少对我来说意外:)我写这个例子来理解发生了什么,我仍然感到困惑。cudaEventElapsedTime不是预期的行为

在下面的例子中我期待汇报三个迭代同一时间,但结果是:

2.80342

2005.6

这意味着总时间在考虑CPU睡眠时间。

我做错了什么?如果没有,是否有可能做我想要的?

#include <iostream> 
#include <thread> 
#include <chrono> 

#include <cuda.h> 
#include <cuda_runtime.h> 
#include "device_launch_parameters.h" 

__global__ void kernel_test(int *a, int N) { 
    for(int i=threadIdx.x;i<N;i+=N) { 
     if(i<N) 
      a[i] = 1; 
    } 
} 

int main(int argc, char ** argv) { 
    cudaEvent_t start[3], stop[3]; 
    for(int i=0;i<3;i++) { 
     cudaEventCreate(&start[i]); 
     cudaEventCreate(&stop[i]); 
    } 

    cudaStream_t stream; 
    cudaStreamCreate(&stream); 

    const int N = 1024 * 1024; 
    int *h_a = (int*)malloc(N * sizeof(int)); 
    int *a = 0; 
    cudaMalloc((void**)&a, N * sizeof(int)); 

    for(int i=0;i<3;i++) { 
     cudaEventRecord(start[i], stream); 
     cudaMemcpyAsync(a, h_a, N * sizeof(int), cudaMemcpyHostToDevice, stream); 
     kernel_test<<<1, 1024, 0, stream>>>(a, N); 
     cudaMemcpyAsync(h_a, a, N*sizeof(int), cudaMemcpyDeviceToHost, stream); 
     cudaEventRecord(stop[i], stream); 

     std::this_thread::sleep_for (std::chrono::seconds(i)); 

     cudaEventSynchronize(stop[i]); 

     float milliseconds = 0; 
     cudaEventElapsedTime(&milliseconds, start[i], stop[i]); 
     std::cout<<milliseconds<<std::endl; 
    } 
    return 0; 
} 

我附加了nsight结果来验证我的示例的行为。

的Windows 8.1

GeForce GTX的780钛

的Nvidia驱动程序:358.50

编辑:

  • 添加的代码是完整的

  • 附NS飞行result

  • 新增SO和驱动程序信息

  • Start eventend eventtime between

+1

这不是一个[MCVE]请编辑你的问题! –

+0

我同意你需要提供一个完整的测试用例。这包括一个MCVE加上你的测试设置(OS,编译命令,GPU)。当我尝试根据你所显示的内容在linux上创建一个测试时,它似乎对我来说是正确的。例子是[here](http://pastebin.com/3Baj6dtE)。 –

+0

你说得对,我错过了一些代码。对不起。我编辑了这个问题。 – nachovall

回答

1

如果你在Windows上使用的WDDM(相对于TCC与特斯拉卡或运行程序Linux)这可能是问题:

由于WDDM内核在调用后不立即执行,而是排入队列到命令缓冲区。一旦缓冲区满了,它就会被刷新,并且排队的命令被实际执行。强制显式刷新命令缓冲区的另一个选项是同步。 现在发生的事情是,你等待前命令缓冲区实际上可以刷新...

编辑 也看到https://devtalk.nvidia.com/default/topic/548639/is-wddm-causing-this-/的问题,以及如何cudaEventQuery(0)可以帮助

+0

这是有道理的,但它不符合nsight结果(现在附加到问题) – nachovall