【发布时间】:2021-08-08 14:52:12
【问题描述】:
我正在使用nvcc -g -G gdbfail.cu 编译以下代码片段。
#include <cstdio>
#include <cinttypes>
__global__ void mykernel() {
uint8_t* ptr = (uint8_t*) malloc(8);
for (int i = 0; i < 8; i++) {
ptr[i] = 7 - i;
}
for (int i = 0; i < 8; i++) { // PUT BREAKPOINT HERE
printf("%" PRIx8 " ", ptr[i]);
}
printf("\n");
}
int main() {
uint8_t* ptr = (uint8_t*) malloc(8);
for (int i = 0; i < 8; i++) {
ptr[i] = 7 - i;
}
for (int i = 0; i < 8; i++) { // PUT BREAKPOINT HERE
printf("%" PRIx8 " ", ptr[i]);
}
printf("\n");
mykernel<<<1,1>>>();
cudaDeviceSynchronize();
}
当我运行 cuda-gdb ./a.out 并在第 10 行 (b 10) 放置断点,运行代码 (r),并尝试在位于 ptr 的地址处打印值时,我得到了令人惊讶的结果
(cuda-gdb) x/8b ptr
0x7fffcddff920: 7 6 5 4 3 2 1 0
(cuda-gdb) x/8b 0x7fffcddff920
0x7fffcddff920: 0 0 0 0 0 0 0 0
当我在主机代码(b 23、r)中做同样的事情时,我会得到预期的结果:
(cuda-gdb) x/8b ptr
0x5555556000a0: 7 6 5 4 3 2 1 0
(cuda-gdb) x/8b 0x5555556000a0
0x5555556000a0: 7 6 5 4 3 2 1 0
为什么当 cuda-gdb 以数字 (0x7fffcddff920) 而不是符号 (ptr) 的形式提供地址时,它不显示正确的内存值?
【问题讨论】: