Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
时间测量CUDA和C#_C#_C_Visual Studio 2010_Cuda - Fatal编程技术网

时间测量CUDA和C#

时间测量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,

我想比较一下我的cuda代码在gpu上的速度(数据已经被复制)和我的代码在CPU上的速度

cuda代码中的测量如下所示

    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;