我正在尝试单步执行在其过程中调用多个内核的主机代码。我想知道是否可以在主机代码中设置任意断点并从 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
。我正在考虑为什么会发生这种情况的两种选择:
为了能够等待内核完成执行而无需手动添加同步调用,可以设置环境变量
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)
thrust::max_element(thrust::device,...)
的调用只会在内核完成后返回(内部实现需要将最大值的索引复制到主机并同步才能返回指向最大值元素的指针)。