3.10. 事件

这些事件之一将创建一个 CUDBGEvent

  • 当前内核的 elf 映像已加载,并且其 DWARF 节中的地址已重新定位(现在可用于设置断点),

  • 设备断点已被命中,

  • CUDA 内核已准备好启动,

  • CUDA 内核已终止。

当创建 CUDBGEvent 时,调试器会通过在 API 结构初始化后调用使用 setNotifyNewEventCallback() 注册的回调函数来通知。由调试器决定哪种通知方法最佳。调试器 API 例程不能从回调函数内部调用,否则例程将返回错误。

收到通知后,调试器负责通过使用 CUDBGAPI_st::getNextEvent() 处理事件队列中的 CUDBGEvents,并通过调用 CUDBGAPI_st::acknowledgeEvent() 向调试器 API 确认事件已处理。 如果事件是由设备本身引发的(例如,命中断点),则事件队列将为空。 调试器有责任在每次收到 CUDBGEvent 时检查硬件。

示例

CUDBGEvent event;
      CUDBGResult res;
      for (res = cudbgAPI->getNextEvent(&event);
           res == CUDBG_SUCCESS && event.kind != CUDBG_EVENT_INVALID;
           res = cudbgAPI->getNextEvent(&event)) {
          switch (event.kind)
              {
              case CUDBG_EVENT_ELF_IMAGE_LOADED:
                  //...
                  break;
              case CUDBG_EVENT_KERNEL_READY:
                  //...
                  break;
              case CUDBG_EVENT_KERNEL_FINISHED:
                  //...
                  break;
              default:
                  error(...);
              }
          }

请参阅 cuda-gdb 源代码中的 cuda-tdep.c 和 cuda-linux-nat.c 文件,以获取有关如何使用 CUDBGEvent 的更详细示例。

struct 
事件信息容器。
struct 
传递给使用 setNotifyNewEventCallback 函数设置的回调的事件信息。
struct 
传递给使用 setNotifyNewEventCallback 函数设置的回调的事件信息。

类型定义

typedef void  ( *CUDBGNotifyNewEventCallback )( CUDBGEventCallbackData*  data )
用于通知调试器事件队列中存在新事件的函数的函数类型。
typedef void  ( *CUDBGNotifyNewEventCallback31 )( void*  data )
用于通知调试器事件队列中存在新事件的函数的函数类型。

枚举

enum CUDBGEventKind
CUDA 内核事件。

变量

CUDBGResult  ( *CUDBGAPI_st::acknowledgeEvent30 )( CUDBGEvent30* event )
通知调试器 API 事件已处理。
CUDBGResult  ( *CUDBGAPI_st::acknowledgeEvents42 )( )
通知调试器 API 同步事件已处理。
CUDBGResult  ( *CUDBGAPI_st::acknowledgeSyncEvents )( )
通知调试器 API 同步事件已处理。
CUDBGResult  ( *CUDBGAPI_st::getErrorStringEx )( char* buf, uint32_t bufSz, uint32_t* msgSz )
使用以 null 结尾的 ASCII 字符串编码的错误消息填充用户提供的缓冲区。 错误消息特定于上次失败的 API 调用,并在每次 API 调用后失效。
CUDBGResult  ( *CUDBGAPI_st::getNextAsyncEvent50 )( CUDBGEvent50* event )
将异步事件队列中的下一个可用事件复制到“event”并将其从队列中移除。 异步事件队列与正常事件队列分开保存,并且不需要调试客户端的确认。
CUDBGResult  ( *CUDBGAPI_st::getNextAsyncEvent55 )( CUDBGEvent55* event )
将异步事件队列中的下一个可用事件复制到“event”并将其从队列中移除。 异步事件队列与正常事件队列分开保存,并且不需要调试客户端的确认。
CUDBGResult  ( *CUDBGAPI_st::getNextEvent )( CUDBGEventQueueType type, CUDBGEvent* event )
将下一个可用事件复制到“event”并将其从队列中移除。
CUDBGResult  ( *CUDBGAPI_st::getNextEvent30 )( CUDBGEvent30* event )
将事件队列中的下一个可用事件复制到“event”并将其从队列中移除。
CUDBGResult  ( *CUDBGAPI_st::getNextEvent32 )( CUDBGEvent32* event )
将事件队列中的下一个可用事件复制到“event”并将其从队列中移除。
CUDBGResult  ( *CUDBGAPI_st::getNextEvent42 )( CUDBGEvent42* event )
将事件队列中的下一个可用事件复制到“event”并将其从队列中移除。
CUDBGResult  ( *CUDBGAPI_st::getNextSyncEvent50 )( CUDBGEvent50* event )
CUDBGResult  ( *CUDBGAPI_st::getNextSyncEvent55 )( CUDBGEvent55* event )
将同步事件队列中的下一个可用事件复制到“event”并将其从队列中移除。
CUDBGResult  ( *CUDBGAPI_st::setNotifyNewEventCallback )( CUDBGNotifyNewEventCallback callback )
向 API 提供要调用的函数,以通知调试器新的应用程序或设备事件。
CUDBGResult  ( *CUDBGAPI_st::setNotifyNewEventCallback31 )( CUDBGNotifyNewEventCallback31 callback, void* data )
向 API 提供要调用的函数,以通知调试器新的应用程序或设备事件。
CUDBGResult  ( *CUDBGAPI_st::setNotifyNewEventCallback40 )( CUDBGNotifyNewEventCallback40 callback )
向 API 提供要调用的函数,以通知调试器新的应用程序或设备事件。

类型定义

void ( *CUDBGNotifyNewEventCallback )( CUDBGEventCallbackData*  data )

用于通知调试器事件队列中存在新事件的函数的函数类型。

void ( *CUDBGNotifyNewEventCallback31 )( void*  data )

用于通知调试器事件队列中存在新事件的函数的函数类型。

枚举

enum CUDBGEventKind

CUDBG_EVENT_INVALID = 0x000
无效事件。
CUDBG_EVENT_ELF_IMAGE_LOADED = 0x001
CUDA 源代码模块的 ELF 映像可用。
CUDBG_EVENT_KERNEL_READY = 0x002
CUDA 内核即将启动。
CUDBG_EVENT_KERNEL_FINISHED = 0x003
CUDA 内核已终止。
CUDBG_EVENT_INTERNAL_ERROR = 0x004
发生内部错误。 调试框架可能不稳定。
CUDBG_EVENT_CTX_PUSH = 0x005
CUDA 上下文已推送。
CUDBG_EVENT_CTX_POP = 0x006
CUDA CTX 已弹出。
CUDBG_EVENT_CTX_CREATE = 0x007
CUDA CTX 已创建。
CUDBG_EVENT_CTX_DESTROY = 0x008
CUDA 上下文已销毁。
CUDBG_EVENT_TIMEOUT = 0x009
超时事件以固定的时间间隔发送。 可以安全地忽略此事件。
CUDBG_EVENT_ATTACH_COMPLETE = 0x00a
附加过程已完成,可以开始调试设备代码。
CUDBG_EVENT_DETACH_COMPLETE = 0x00b
CUDBG_EVENT_ELF_IMAGE_UNLOADED = 0x00c
CUDBG_EVENT_FUNCTIONS_LOADED = 0x00d
CUDBG_EVENT_ALL_DEVICES_SUSPENDED = 0x00e

变量

CUDBGResult ( *CUDBGAPI_st::acknowledgeEvent30 )( CUDBGEvent30* event )

通知调试器 API 事件已处理。 自 CUDA 3.0 起。

参数
event
- 指向已处理事件的指针
返回值

CUDBG_SUCCESS

CUDBGResult ( *CUDBGAPI_st::acknowledgeEvents42 )( )

通知调试器 API 同步事件已处理。 自 CUDA 3.1 起。

返回值

CUDBG_SUCCESS

CUDBGResult ( *CUDBGAPI_st::acknowledgeSyncEvents )( )

通知调试器 API 同步事件已处理。 自 CUDA 5.0 起。

返回值

CUDBG_SUCCESS

CUDBGResult ( *CUDBGAPI_st::getErrorStringEx )( char* buf, uint32_t bufSz, uint32_t* msgSz )

使用以 null 结尾的 ASCII 字符串编码的错误消息填充用户提供的缓冲区。 错误消息特定于上次失败的 API 调用,并在每次 API 调用后失效。 自 CUDA 12.2 起。

另请参阅

getErrorString

参数
buf
- 目标缓冲区
bufSz
- 目标缓冲区的大小(以字节为单位)
msgSz
- 错误消息的大小,包括终止 null 字符。
返回值

CUDBG_SUCCESS、CUDBG_ERROR_BUFFER_TOO_SMALL CUDBG_ERROR_INVALID_ARGS、CUDBG_ERROR_UNINITIALIZED

CUDBGResult ( *CUDBGAPI_st::getNextAsyncEvent50 )( CUDBGEvent50* event )

将异步事件队列中的下一个可用事件复制到“event”并将其从队列中移除。 异步事件队列与正常事件队列分开保存,并且不需要调试客户端的确认。 自 CUDA 5.0 起。

参数
event
- 指向要在其中复制事件参数的事件容器的指针
返回值

CUDBG_SUCCESS、CUDBG_ERROR_NO_EVENT_AVAILABLE、CUDBG_ERROR_INVALID_ARGS

CUDBGResult ( *CUDBGAPI_st::getNextAsyncEvent55 )( CUDBGEvent55* event )

将异步事件队列中的下一个可用事件复制到“event”并将其从队列中移除。 异步事件队列与正常事件队列分开保存,并且不需要调试客户端的确认。 自 CUDA 5.5 起。

参数
event
- 指向要在其中复制事件参数的事件容器的指针
返回值

CUDBG_SUCCESS、CUDBG_ERROR_NO_EVENT_AVAILABLE、CUDBG_ERROR_INVALID_ARGS

CUDBGResult ( *CUDBGAPI_st::getNextEvent )( CUDBGEventQueueType type, CUDBGEvent* event )

将下一个可用事件复制到“event”并将其从队列中移除。 自 CUDA 6.0 起。

参数
type
- 应用程序事件队列类型
event
- 指向要在其中复制事件参数的事件容器的指针
返回值

CUDBG_SUCCESS、CUDBG_ERROR_NO_EVENT_AVAILABLE、CUDBG_ERROR_INVALID_ARGS

CUDBGResult ( *CUDBGAPI_st::getNextEvent30 )( CUDBGEvent30* event )

将事件队列中的下一个可用事件复制到“event”并将其从队列中移除。 自 CUDA 3.0 起。

参数
event
- 指向要在其中复制事件参数的事件容器的指针
返回值

CUDBG_SUCCESS、CUDBG_ERROR_NO_EVENT_AVAILABLE、CUDBG_ERROR_INVALID_ARGS

CUDBGResult ( *CUDBGAPI_st::getNextEvent32 )( CUDBGEvent32* event )

将事件队列中的下一个可用事件复制到“event”并将其从队列中移除。 自 CUDA 3.1 起。

参数
event
- 指向要在其中复制事件参数的事件容器的指针
返回值

CUDBG_SUCCESS、CUDBG_ERROR_NO_EVENT_AVAILABLE、CUDBG_ERROR_INVALID_ARGS

CUDBGResult ( *CUDBGAPI_st::getNextEvent42 )( CUDBGEvent42* event )

将事件队列中的下一个可用事件复制到“event”并将其从队列中移除。 自 CUDA 4.0 起。

参数
event
- 指向要在其中复制事件参数的事件容器的指针
返回值

CUDBG_SUCCESS、CUDBG_ERROR_NO_EVENT_AVAILABLE、CUDBG_ERROR_INVALID_ARGS

CUDBGResult ( *CUDBGAPI_st::getNextSyncEvent50 )( CUDBGEvent50* event )

自 CUDA 5.0 起。

参数
event
- 指向要在其中复制事件参数的事件容器的指针
返回值

CUDBG_SUCCESS、CUDBG_ERROR_NO_EVENT_AVAILABLE、CUDBG_ERROR_INVALID_ARGS

CUDBGResult ( *CUDBGAPI_st::getNextSyncEvent55 )( CUDBGEvent55* event )

将同步事件队列中的下一个可用事件复制到“event”并将其从队列中移除。 自 CUDA 5.5 起。

参数
event
- 指向要在其中复制事件参数的事件容器的指针
返回值

CUDBG_SUCCESS、CUDBG_ERROR_NO_EVENT_AVAILABLE、CUDBG_ERROR_INVALID_ARGS

CUDBGResult ( *CUDBGAPI_st::setNotifyNewEventCallback )( CUDBGNotifyNewEventCallback callback )

向 API 提供要调用的函数,以通知调试器新的应用程序或设备事件。 自 CUDA 4.1 起。

参数
callback
- 回调函数
返回值

CUDBG_SUCCESS

CUDBGResult ( *CUDBGAPI_st::setNotifyNewEventCallback31 )( CUDBGNotifyNewEventCallback31 callback, void* data )

向 API 提供要调用的函数,以通知调试器新的应用程序或设备事件。 自 CUDA 3.0 起。

参数
callback
- 回调函数
data
- 要传递给回调的指针(调用时)
返回值

CUDBG_SUCCESS

CUDBGResult ( *CUDBGAPI_st::setNotifyNewEventCallback40 )( CUDBGNotifyNewEventCallback40 callback )

向 API 提供要调用的函数,以通知调试器新的应用程序或设备事件。 自 CUDA 3.2 起。

参数
callback
- 回调函数
返回值

CUDBG_SUCCESS