来自.net StopWatch的时间不一致

Dr.*_*YSG 1 .net c# timing stopwatch cudafy.net

我有一个C#和.NET应用程序,它使用GPU(NVIDA GTX980)进行图像处理.有4个阶段,我将CPU与GPU同步(时间上没有重叠)来进行计时.但这些数字并没有加起来.

Launch()将执行GPU内核的异步启动,但synchronize()将等待它完成.

  1. 总计: tThreshold:4.2827ms

  • tHistogram:3.7714ms
  • tHistogramSum:0.1065ms
  • tIQR:3.8603ms
  • tThresholdOnly:0.4126ms

到底是怎么回事?

   public static void threshold()
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        gpu.Lock();
        dim3 block = new dim3(tileWidthBig, tileHeightBig);
        dim3 grid = new dim3(Frame.width / tileWidthBig, Frame.height / tileHeightBig);
        gpu.Launch(grid, block).gHistogram(gForeground, gPercentile, gInfo);
        gpu.Synchronize();
        tHistogram = watch.Elapsed.TotalMilliseconds;

        block = new dim3(1024);
        grid = new dim3(1);
        gpu.Launch(grid, block).gSumHistogram(gPercentile);
        gpu.Synchronize();
        tHistogramSum = watch.Elapsed.TotalMilliseconds - tHistogram;

        gpu.Launch(grid, block).gIQR(gPercentile, gInfo);
        gpu.Synchronize();
        tIQR = watch.Elapsed.TotalMilliseconds - tHistogramSum;

        block = new dim3(256, 4);
        grid = new dim3(Frame.width / 256, Frame.height / 4);
        gpu.Launch(grid, block).gThreshold(gForeground, gMask, gInfo);
        gpu.Synchronize();
        tThresholdOnly = watch.Elapsed.TotalMilliseconds - tIQR;

        gpu.Unlock();
        watch.Stop();
        tThreshold = watch.Elapsed.TotalMilliseconds;
    }
Run Code Online (Sandbox Code Playgroud)

Pau*_*ulF 6

由于TotalMilliseconds不断递增并且您试图找到时间点之间的差异,您需要在第二个之后减去前面差异的总和,因此:

tIQR = watch.Elapsed.TotalMillisconds - (tHistogram + tHistogramSum);
Run Code Online (Sandbox Code Playgroud)

&

tThresholdOnly= watch.Elapsed.TotalMillisconds - (tHistogram + tHistogramSum + tIQR);
Run Code Online (Sandbox Code Playgroud)