CUDA C++编程指南(7.31&32&33&34)——C++语言扩展之性能分析计数器函数和断言、陷阱、断点函数

7.31. 性能分析计数器函数

每个多处理器都配备了一组16个硬件计数器,应用程序可以通过调用__prof_trigger()函数,用一条指令来递增这些计数器。

复制代码
void __prof_trigger(int counter);

每个warp将索引为counter的每多处理器硬件计数器递增1。计数器8至15为保留值,应用程序不应使用。

计数器0、1、...、7的值可以通过nvprof工具使用nvprof --events prof_trigger_0x命令获取,其中x取值为0、1、...、7。所有计数器在每次内核启动前都会重置(请注意,在收集计数器数据时,内核启动是同步进行的)。

7.32. 断言

断言功能仅支持计算能力2.x及更高版本的设备。

复制代码
void assert(int expression);

如果expression等于零,则停止内核执行。如果程序在调试器中运行,这将触发断点,调试器可用于检查设备的当前状态。否则,对于expression等于零的每个线程,在通过cudaDeviceSynchronize()cudaStreamSynchronize()cudaEventSynchronize()与主机同步后,会向stderr打印一条消息。该消息的格式如下:

复制代码
<filename>:<line number>:<function>:
block: [blockId.x,blockId.x,blockIdx.z],
thread: [threadIdx.x,threadIdx.y,threadIdx.z]
Assertion `<expression>` failed.

针对同一设备的任何后续主机端同步调用都将返回cudaErrorAssert。在调用cudaDeviceReset()重新初始化设备之前,无法向该设备发送更多命令。

如果expression不为零,则内核执行不受影响。

例如,以下程序来自源文件 test.cu

复制代码
#include <assert.h>

__global__ void testAssert(void)
{
    int is_one = 1;
    int should_be_one = 0;

    // This will have no effect
    assert(is_one);

    // This will halt kernel execution
    assert(should_be_one);
}

int main(int argc, char* argv[])
{
    testAssert<<<1,1>>>();
    cudaDeviceSynchronize();

    return 0;
}

将输出:

复制代码
test.cu:19: void testAssert(): block: [0,0,0], thread: [0,0,0] Assertion `should_be_one` failed.

断言(Assertions)主要用于调试目的。它们可能会影响性能,因此建议在生产代码中禁用断言。通过在包含assert.h头文件之前定义NDEBUG预处理器宏,可以在编译时禁用断言。需要注意的是,expression不应是具有副作用的表达式(例如类似(++i > 0)的表达式),否则禁用断言会影响代码的功能。

7.33. 陷阱函数

可以通过从任意设备线程调用__trap()函数来启动陷阱操作。

复制代码
void __trap();

内核执行被中止,并在主机程序中引发中断。

7.34. 断点函数

可以通过从任意设备线程调用__brkpt()函数来暂停内核函数的执行。

复制代码
void __brkpt();
相关推荐
AI_56786 小时前
Wireshark抓包入门:过滤规则+协议分析定位故障
人工智能
精彩极了吧6 小时前
C++基础知识-(②)面向对象(上)
c++·类和对象·封装·this指针·类的默认成员函数·赋值运算符重载
三水彡彡彡彡6 小时前
深入理解指针:常量、函数与数组
c++·学习
政安晨6 小时前
政安晨【人工智能项目随笔】OpenClaw:开源个人AI助手的全面解读与应用实践报告【作者检索信息的应用调查报告随笔】
人工智能·ai·开源·ai-agent·openclaw·调查报告·openclaw调查报告
你好!蒋韦杰-(烟雨平生)6 小时前
Opengl模拟水面
c++·游戏·3d
Rhystt6 小时前
代码随想录第二十六天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
数据结构·c++·算法·leetcode
带娃的IT创业者6 小时前
意识的奥秘:从哲学思辨到工程实践
人工智能·神经网络·脑机接口·ai智能体·深度学习应用·nct·人工智能框架
忙碌5446 小时前
2026年大语言模型微调实战:从零到一构建专属AI助手
人工智能·深度学习
组合缺一6 小时前
赋予 AI 灵魂:如何在 Java AI 生态实现一个会“自我反思”的长期记忆系统
java·人工智能·ai·llm·agent·solon·mcp
向哆哆6 小时前
厨房食品卫生安全检测数据集:智能餐饮与食品安全保障的视觉卫士
人工智能·安全·目标跟踪