如何将CUDA时钟周期转换为毫秒?

2024-04-15

我想用一些代码来测量时间within我的内核需要。我已经关注了这个问题 https://stackoverflow.com/questions/11209228/timing-different-sections-in-cuda-kernel连同它的注释,这样我的内核看起来像这样:

__global__ void kernel(..., long long int *runtime)
{
    long long int start = 0; 
    long long int stop = 0;

    asm volatile("mov.u64 %0, %%clock64;" : "=l"(start));

    /* Some code here */

    asm volatile("mov.u64 %0, %%clock64;" : "=l"(stop));

    runtime[threadIdx.x] = stop - start;
    ...
}

答案说要进行如下转换:

计时器计算时钟滴答数。要获取毫秒数,请将其除以设备上的 GHz 数,然后乘以 1000。

为此,我这样做:

for(long i = 0; i < size; i++)
{
  fprintf(stdout, "%d:%ld=%f(ms)\n", i,runtime[i], (runtime[i]/1.62)*1000.0);
}

其中 1.62 是我的设备的 GPU 最大时钟速率。但我得到的以毫秒为单位的时间看起来不正确,因为它表明每个线程需要几分钟才能完成。这是不正确的,因为执行在不到一秒的挂钟时间内完成。转换公式不正确还是我在某个地方犯了错误?谢谢。


您的情况下正确的转换不是 GHz:

fprintf(stdout, "%d:%ld=%f(ms)\n", i,runtime[i], (runtime[i]/1.62)*1000.0);
                                                             ^^^^

但是赫兹:

fprintf(stdout, "%d:%ld=%f(ms)\n", i,runtime[i], (runtime[i]/1620000000.0f)*1000.0);
                                                             ^^^^^^^^^^^^^

在维度分析中:

                  clock cycles
clock cycles  /  -------------- = seconds
                   second
                    

第一项是时钟周期测量。第二项是 GPU 的频率(以赫兹为单位,而不是 GHz),第三项是所需的测量值(秒)。您可以通过将秒乘以 1000 来转换为毫秒。

这是一个有效的示例,展示了一种独立于设备的方法(因此您不必对时钟频率进行硬编码):

$ cat t1306.cu
#include <stdio.h>

const long long delay_time = 1000000000;
const int nthr = 1;
const int nTPB = 256;

__global__ void kernel(long long *clocks){

  int idx=threadIdx.x+blockDim.x*blockIdx.x;
  long long start=clock64();
  while (clock64() < start+delay_time);
  if (idx < nthr) clocks[idx] = clock64()-start;
}

int main(){

  int peak_clk = 1;
  int device = 0;
  long long *clock_data;
  long long *host_data;
  host_data = (long long *)malloc(nthr*sizeof(long long));
  cudaError_t err = cudaDeviceGetAttribute(&peak_clk, cudaDevAttrClockRate, device);
  if (err != cudaSuccess) {printf("cuda err: %d at line %d\n", (int)err, __LINE__); return 1;}
  err = cudaMalloc(&clock_data, nthr*sizeof(long long));
  if (err != cudaSuccess) {printf("cuda err: %d at line %d\n", (int)err, __LINE__); return 1;}
  kernel<<<(nthr+nTPB-1)/nTPB, nTPB>>>(clock_data);
  err = cudaMemcpy(host_data, clock_data, nthr*sizeof(long long), cudaMemcpyDeviceToHost);
  if (err != cudaSuccess) {printf("cuda err: %d at line %d\n", (int)err, __LINE__); return 1;}
  printf("delay clock cycles: %ld, measured clock cycles: %ld, peak clock rate: %dkHz, elapsed time: %fms\n", delay_time, host_data[0], peak_clk, host_data[0]/(float)peak_clk);
  return 0;
}
$ nvcc -arch=sm_35 -o t1306 t1306.cu
$ ./t1306
delay clock cycles: 1000000000, measured clock cycles: 1000000210, peak clock rate: 732000kHz, elapsed time: 1366.120483ms
$

这使用cudaDeviceGetAttribute http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1gb22e8256592b836df9a9cc36c9db7151获取时钟速率,它返回以 kHz 为单位的结果,这使我们能够在这种情况下轻松计算毫秒。

根据我的经验,上述方法通常适用于时钟频率以报告速率运行的数据中心 GPU(可能会受到您在nvidia-smi.)其他 GPU(例如 GeForce GPU)可能以(不可预测的)升压时钟运行,这将使该方法不准确。

此外,最近,CUDA 能够抢占 GPU 上的活动。这可以在多种情况下发生,例如调试、CUDA 动态并行性和其他情况。如果由于某种原因发生抢占,则尝试根据clock64()一般是不可靠的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将CUDA时钟周期转换为毫秒? 的相关文章

  • 仅使用 CUDA 进行奇异值计算

    我正在尝试使用新的cusolverDnSgesvdCUDA 7 0 用于计算奇异值的例程 完整代码如下 include cuda runtime h include device launch parameters h include
  • 如何确定完整的 CUDA 版本 + 颠覆版本?

    Linux 上的 CUDA 发行版曾经有一个名为version txt例如 CUDA Version 10 2 89 这非常有用 但是 从 CUDA 11 1 开始 该文件不再存在 我如何在 Linux 上通过命令行确定并检查 path t
  • 如何并行从数组中删除零值

    如何使用 CUDA 并行有效地从数组中删除零值 有关零值数量的信息是预先可用的 这应该可以简化这项任务 重要的是数字必须保持源数组中的顺序 当被复制到结果数组时 Example 该数组将例如包含以下值 0 0 19 7 0 3 5 0 0
  • CUDA线程执行顺序

    我有一个 CUDA 程序的以下代码 include
  • Nvcc 的版本与 CUDA 不同

    我安装了 cuda 7 但是当我点击 nvcc version 时 它打印出 6 5 我想在 GTX 960 卡上安装 Theano 库 但它需要 nvcc 7 0 我尝试重新安装cuda 但它没有更新nvcc 当我运行 apt get i
  • __syncthreads() 死锁

    如果只有部分线程执行 syncthreads 会导致死锁吗 我有一个这样的内核 global void Kernel int N int a if threadIdx x
  • 查明某个时间段是否与当前时间匹配

    我有一个这样的约会 just a example date time in the future start date H i time 60 60 24 7 time in the future end date H i time 60
  • Android 日期/时间显示 0 而不是 12

    我想知道下面的代码有什么问题 Assign hour set in the picker c set Calendar HOUR selectedHour c set Calendar MINUTE selectedMinute For a
  • 如何找到与日期范围最重叠的时间段

    假设您有一个包含标识符 开始时间和结束时间的表 这些开始和结束时间可以是任意时间长度 开始时间始终早于结束时间 假设没有空值 什么样的查询会告诉我最 流行 的时间 即每行中的两个范围与大多数其他行重叠的位置 它的实际应用是它是一个记录用户登
  • C++:如何通过时间和本地时间获取实际时间?

    我正在寻找一种在 C 中以 HH MM SS 方式节省时间的方法 我在这里看到它们有很多解决方案 经过一番研究后我选择了time and localtime 然而 似乎localtime函数有点棘手 因为它says http rabbit
  • 在 __device/global__ CUDA 内核中动态分配内存

    根据CUDA 编程指南 http developer download nvidia com compute cuda 3 2 prod toolkit docs CUDA C Programming Guide pdf 第 122 页 可
  • PHP 日期/时间格式,需要一些帮助

    你能帮我使用 PHP 格式化以下日期吗 变量 start 包含以下日期 这个日期 Wed Feb 01 2012 05 00 00 GMT 080 应该成为 2012 02 01T13 00 00 我知道如何使用基本的 PHP 日期 时间格
  • CUDA 矩阵加法时序,按行与按行比较按栏目

    我目前正在学习 CUDA 并正在做一些练习 其中之一是实现以 3 种不同方式添加矩阵的内核 每个元素 1 个线程 每行 1 个线程和每列 1 个线程 矩阵是方阵 并被实现为一维向量 我只需用以下命令对其进行索引 A N row col 直觉
  • 哪些语言可以很好地进行日期、时间和日历操作? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这可能是一个过分的要求 但是有没有一种语言能够真正出色地表示时间和日期操作呢 我会立即承认这是真的很难编写一个真正伟大的时间库 也就是
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • 将纪元时间转换为日期 PHP

    我现在正在使用一个 API 它提供了一个 epochTime 我已尝试一切方法将此纪元转换为日期 但它似乎不起作用 包括 epoch time 1000然后使用date 函数来转换它 纪元时间看起来像这样 1353430853299 有办法
  • 如何将 currentTimeMillis 转换为可读的日期格式? [复制]

    这个问题在这里已经有答案了 我想用currentTimeMillis两次 这样我就可以计算持续时间 但我也想以用户可读的格式显示时间和日期 我遇到了麻烦currentTimeMillis有利于计算 但我看不到内置函数可以转换为合适的时间或时
  • cudaMemcpy() 与 cudaMemcpyFromSymbol()

    我试图找出原因cudaMemcpyFromSymbol 存在 似乎 symbol func 可以做的所有事情 nonSymbol cmd 也可以做 symbol func 似乎可以轻松移动数组或索引的一部分 但这也可以使用 nonSymbo
  • Python-将秒从纪元时间转换为人类可读时间[重复]

    这个问题在这里已经有答案了 最初我编写了这段代码来将日期转换为人类可读的时间 a datetime datetime strptime time Y m d H M S f b datetime datetime now c b a day
  • 处理 C++ 中执行时间的大量分析

    我目前正在进行一个科学计算项目 涉及海量数据和复杂算法 因此需要进行大量代码分析 我目前依靠的是

随机推荐

  • 如何使用 CSS 实现这种视觉效果

    我需要仅使用 css 和一个高度和宽度为 300px 的 div 创建上述视觉效果 我尝试了渐变但无法得到任何相同的东西 有人可以帮忙吗 渐变是一个好主意 您甚至可以添加内容 无论渐变的大小如何 只要将其大小设置为正方形即可 div bac
  • 使用带有几个字符串的 Ionic Storage 的 QuotaExceededError

    我在离子存储方面遇到了这个问题 这是完整的堆栈跟踪 core es5 js 1084 ERROR Error Uncaught in promise QuotaExceededError at c polyfills js 3 at c p
  • 如何使用词袋进行训练和预测?

    我有一个文件夹 里面有汽车各个角度的图像 我想使用词袋方法来训练系统识别汽车 训练完成后 我希望如果给出那辆车的图像 它应该能够识别它 我一直在尝试学习 opencv 中的 BOW 函数 以便完成这项工作 并且已经达到了我现在不知道该怎么做
  • vue.js 可以绑定内联样式吗?

    我很好奇 Vue js 中是否可以绑定内联样式 我熟悉类绑定 但是如果有时由于某种原因您想要内联绑定样式语句 是否可以像对待类一样绑定它 例如
  • 枚举和字典<枚举,操作>

    我希望我能以每个人都清楚的方式解释我的问题 我们需要您对此的建议 我们有一个枚举类型 它定义了超过 15 个常量 我们收到来自 Web 服务的报告 并将其一列转换为此枚举类型 根据我们从该网络服务收到的信息 我们使用以下命令运行特定功能 字
  • 有什么例子可以说明了解 C 语言可以让我用任何其他语言编写更好的代码?

    在 Stack Overflow 播客中 Joel Spolsky 不断地抱怨 Jeff Atwood 不知道如何用 C 语言编写代码 他的说法是 了解 C 可以帮助你编写更好的代码 他还总是使用某种涉及字符串操作的故事 以及了解 C 如何
  • Azure 数据工厂 v2:活动执行管道输出

    有没有办法在活动 执行管道 中引用已执行管道的输出 即 主管道按顺序执行2个管道 第一个管道生成一个自己创建的 run id 需要将其作为参数转发到第二个管道 我已阅读文档并检查主管道是否记录了第一个管道的输出 但看起来这不可能直接实现 到
  • 断言:exportArchive:“Test.app”需要配置文件

    当我尝试在 Xcode9 中使用 Xcode 服务器集成持续集成时 我可以成功创建 BOT 并尝试集成 然后我总是收到类似的错误 断言 exportArchive Test app 需要配置文件 如何解决这个问题 我遇到了同样的问题 并按照
  • torch.mm、torch.matmul 和 torch.mul 有什么区别?

    阅读完 pytorch 文档后 我仍然需要帮助来理解之间的区别torch mm torch matmul and torch mul 由于我不完全理解它们 所以我无法简明地解释这一点 B torch tensor 1 1207 0 3137
  • Java 中保存最后 N 个元素的大小受限队列

    关于 Java 库的一个非常简单快速的问题 是否有一个现成的类可以实现Queue具有固定的最大大小 即它始终允许添加元素 但它会默默地删除头元素以为新添加的元素提供空间 当然 手动实现它很简单 import java util Linked
  • 如何检测 highcharts 中的缩放事件?

    是否可以检测 Highcharts 中的缩放事件 我的用例是 我有一些图表外部的状态 当用户放大其中的一部分时 我想检测 x 轴上的新时间范围并更新相应的外部状态 你有没有尝试过高图表API http api highcharts com
  • 需要帮助解决 sorl-thumbnail 错误:“‘thumbnail’不是有效的标签库:”

    我一直在绞尽脑汁试图解决这个问题 我已经尝试了一切 但我没有任何想法 我不断看到这个错误 异常值 thumbnail 不是有效的标签库 无法从 django templatetags thumbnail 加载模板库 没有名为 sorl th
  • std::initializer_list 和引用类型

    Can a std initializer list包含引用类型 右值和左值 或者是否必须使用指针或引用包装器 例如std ref EDIT 也许需要更多澄清 我有一个成员变量 std vector
  • R 中的 Unicode 下标

    我想写 sigma 2 i使用 unicode 我可以得到三分之二的方法 u03C3 U00B2 我一生都无法弄清楚如何添加下标 根据在这个网站上我得到了上标 2 的 unicode http www fileformat info inf
  • Silex - app->json() 以字符串形式返回整数数据

    我刚刚开始使用 Silex 来帮助我构建一个从 MySQL 数据库返回数据的 Restful API 以前在使用 php 和 mysql 时 我注意到 MySQL 会在我的文件中将整数作为字符串返回json encode 功能 它会在我的所
  • iTunes Connect 上的销售统计数据多久更新一次? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的应用程序今天被 Apple 接受 我正在尝试计算它已被下载了多少次 有谁知道 iTunes Con
  • npm install git+ssh 在 docker (node16) 中失败

    谁能解释一下为什么要从node 14 alpine to node 16 alpine会导致npm安装失败吗 gt 8 10 RUN mount type ssh npm i 14 14 27 npm ERR code 128 14 14
  • InProc 会话数据消失

    我大约一周前才注意到这一点 我正在存储有关用户正在玩的当前谜题的数据 www wikipediamaze com 如下所示 HttpContext Current Session Add puzzleInfo currentPuzzleIn
  • 使用 jQuery 将宽度设置为百分比

    如何使用 jQuery 将 div 的宽度设置为百分比 使用width http api jquery com width 功能 div somediv width 70 将转向 div div into div style width 7
  • 如何将CUDA时钟周期转换为毫秒?

    我想用一些代码来测量时间within我的内核需要 我已经关注了这个问题 https stackoverflow com questions 11209228 timing different sections in cuda kernel连