在CUDA中在主机和设备之间传递变量

我有以下CUDA内核,它执行广度优先搜索。

__global__ void bfs(const Edge* edges, int* vertices, int* current_depth, bool* done){ int e = blockDim.x * blockIdx.x + threadIdx.x; int vfirst = edges[e].first; int dfirst = vertices[vfirst]; int vsecond = edges[e].second; int dsecond = vertices[vsecond]; if((dfirst == *current_depth) && (dsecond == -1)){ vertices[vsecond] = dfirst +1; *current_depth = dfirst+1; *done = false; } if((dsecond == *current_depth) && (dfirst == -1)){ vertices[vfirst] = dsecond + 1; *current_depth = dsecond +1; *done = false; } } 

此内核获取在主机上分配的值,然后在设备上进行修改并写回主机。

所以我已经声明了这两个变量并以这种方式将它们复制到设备中

 bool h_done = true; bool* d_done; int* d_current_depth; int h_current_depth = 0; cudaMalloc((void**)&d_done, sizeof(bool)); cudaMalloc((void**)&d_current_depth, sizeof(int)); cudaMemcpy(d_done, &h_done, sizeof(bool), cudaMemcpyHostToDevice); cudaMemcpy(d_current_depth, &h_current_depth, sizeof(int), cudaMemcpyHostDevice); 

并在这里循环启动内核。

 bfs<<>>(h_edges, h_vertices, d_current_depth, d_done); 

代码编译并运行正常,但主机值永远不会在设备上修改,反之亦然。 我已经详细介绍了NVIDIA示例代码,但似乎无法做到这一点。 我是CUDA的新手。 任何帮助赞赏。

这个:

 bfs<<>>(h_edges, h_vertices, d_current_depth, d_done); 

几乎肯定是错的。

除非您使用托管内存(我怀疑), h_edgesh_vertices (在其名称中)是在主机内存中的变量。 您无法在设备代码中传递和修改常规主机指针。 由于这个错误,你的内核很可能无法运行。

您的代码报告的未指定的启动错误很可能是由此引起的。