是否可以从cuda-gdb进行cudaDeviceSynchronize

问题描述 投票:0回答:1

我正在尝试单步执行在其过程中调用多个内核的主机代码。我想知道是否可以在主机代码中设置任意断点并从 cuda-gdb 命令行手动设置

cudaDeviceSynchronize
。这可能吗?

编辑:

我的用例是我想检查以下两行代码的值

uint32_t *resultValb4Sort = thrust::max_element(thrust::device, binningState.point_list_unsorted, binningState.point_list_unsorted + num_rendered); 
uint64_t *resultKeyb4Sort = thrust::max_element(thrust::device, binningState.point_list_keys_unsorted, binningState.point_list_keys_unsorted + num_rendered); 

但是,如果我直接在两行之后的断点上直接打印它们的值,则会打印

0
。我正在考虑为什么会发生这种情况的两种选择:

  1. 内核尚未完成,因此我无法从指针获取值
  2. 如果我先将它们复制到主机内存,那么我可以正确检查该值。我可以不从主机代码打印设备内存吗?
cuda cuda-gdb
1个回答
0
投票

为了能够等待内核完成执行而无需手动添加同步调用,可以设置环境变量

CUDA_LAUNCH_BLOCKING=1
。这将使所有内核启动同步,并有助于使用 cuda-gdb 逐步执行代码。

关于您添加的问题:

uint32_t *resultValb4Sort = thrust::max_element(thrust::device, binningState.point_list_unsorted, binningState.point_list_unsorted + num_rendered); 
uint64_t *resultKeyb4Sort = thrust::max_element(thrust::device, binningState.point_list_keys_unsorted, binningState.point_list_keys_unsorted + num_rendered)
  1. 这里,对
    thrust::max_element(thrust::device,...)
    的调用只会在内核完成后返回(内部实现需要将最大值的索引复制到主机并同步才能返回指向最大值元素的指针)。
  2. 返回的指针指向设备内存中的元素,并且不能使用cuda-gdb取消引用进行打印。
© www.soinside.com 2019 - 2024. All rights reserved.