时间测量CUDA和C#
我想比较一下我的cuda代码在gpu上的速度(数据已经被复制)和我的代码在CPU上的速度 cuda代码中的测量如下所示时间测量CUDA和C#,c#,c,visual-studio-2010,cuda,C#,C,Visual Studio 2010,Cuda,我想比较一下我的cuda代码在gpu上的速度(数据已经被复制)和我的代码在CPU上的速度 cuda代码中的测量如下所示 cudaEvent_t start, stop; cudaEventCreate(&start); cudaEventRecord(start,0); //Kernel Execution transformKernel7<<<grid,threads>>>(dev_result, width,
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventRecord(start,0);
//Kernel Execution
transformKernel7<<<grid,threads>>>(dev_result, width, height, angle, N);
cudaEventCreate(&stop);
cudaEventRecord(stop,0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&cuTime, start,stop);
我的问题是sw.elapsedmillesons不够精确。它给出了我的0,表示时间为0.02490834
我会使用刻度,但我不确定如何重新计算刻度以获得正确的结果。Cuda代码中的时间可以给出类似于0.058938483的值。秒表不够精确
有什么想法吗?根据MSDN,滴答声是一种长类型,一毫秒内有10000个。所以,你可以手工计算
sw.elapsedmillesons属性的部分问题可能是使用了var数据类型。您的输出表明var被编译为int。请自己定义变量的类型,编译器不会给它错误的类型
elapsedmillesons
提供经过的整数时间。所以你不能通过这个属性得到分数部分。你需要自己计算
如果需要更精确的时间,请将ElapsedTicks
除以Stopwatch.Frequency
以秒为单位计算时间。然后转换为所需的时间单位
var elapsedMilliseconds = (double)(sw.ElapsedTicks * 1000L) / Stopwatch.Frequency;
使用
StopWatch.ElapsedTicks
,如果不够精细,请在比较中做更多的工作,如果您想知道滴答声的持续时间,请查看Frequency
属性,它因系统而异,@Silve2611您应该将第二个cudaEventCreate()移动到第一个cudaeventcord()之前为避免可能增加第二个cudaEventRecord()的提交延迟。我建议您在开始计时操作之前创建start和stop。我很好奇,您是如何推断变量被设置为int的?据我所知,编译器将把变量设置为Int64(long),因为这是表达式右侧的数据类型。Poster说这是一个小于1的十进制值,它将被截断为0。这听起来像是一个浮点开始转换成整数。不过你说的听起来是正确的。
var elapsedMilliseconds = (double)(sw.ElapsedTicks * 1000L) / Stopwatch.Frequency;