2015-06-23 6 views
1

У меня есть приложение C# & .NET, которое использует графический процессор (NVIDA GTX980) для обработки изображений. Существует 4 этапа, и я синхронизирую процессор с графическим процессором (без перекрытия во времени), чтобы выполнить синхронизацию. Но цифры не складываются.Непоследовательное время от .net StopWatch

Launch() будет делать асинхронный запуск ядра GPU), но синхронизировать() будет ждать, пока это не будет сделано.

  1. Всего: tThreshold: 4.2827ms

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

Что происходит?

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; 
    } 
+1

Вы просто спрашиваете, почему 4 значения не суммируются? Существует некоторая базовая арифметическая логика, в которой вы ошибаетесь, если это так ... –

+0

не должен tIQR = TotalMillisconds - (tHistogram + tHistogramSum) & tThresholdOnly аналогично вычитать сумму предыдущих значений. – PaulF

ответ

6

Как TotalMilliseconds постоянно увеличивающиеся & вы пытаетесь найти различие между точками во время, необходимо вычесть сумму предыдущих различий после второго, следовательно:

tIQR = watch.Elapsed.TotalMillisconds - (tHistogram + tHistogramSum); 

&

tThresholdOnly= watch.Elapsed.TotalMillisconds - (tHistogram + tHistogramSum + tIQR);