0

我目前正在 CUDA 中尝试我的第一个动态并行代码。这很简单。在父内核中,我正在做这样的事情:

int aPayloads[32];
// Compute aPayloads start values here

int* aGlobalPayloads = nullptr;
cudaMalloc(&aGlobalPayloads, (sizeof(int) *32));
cudaMemcpyAsync(aGlobalPayloads, aPayloads, (sizeof(int)*32), cudaMemcpyDeviceToDevice));

mykernel<<<1, 1>>>(aGlobalPayloads); // Modifies data in aGlobalPayloads
cudaDeviceSynchronize();

// Access results in payload array here

假设到目前为止我做的事情是正确的,那么aGlobalPayloads在内核执行后访问结果的最快方法是什么?(我试图cudaMemcpy()复制aGlobalPayloadsaPayloadscudaMemcpy()不允许在设备代码中)。

4

1 回答 1

3
  1. 您可以直接aGlobalPayloads从父内核代码访问数据,无需任何复制:

    mykernel<<<1, 1>>>(aGlobalPayloads); // Modifies data in aGlobalPayloads
    cudaDeviceSynchronize();
    int myval = aGlobalPayloads[0];
    
  2. 我鼓励仔细检查错误(在这里阅读整个接受的答案)。您在设备代码中执行此操作的方式与在主机代码中相同。编程指南指出: “可能不会传入本地或共享内存指针”。您使用的aPayloads是本地内存指针。

  3. 如果出于某种原因您希望将该数据显式放回本地数组中,则可以使用内核memcpy内:

    memcpy(aPayloads, aGlobalPayloads, sizeof(int)*32);
    int myval = aPayloads[0]; // retrieves the same value
    

    (这也是我如何解决我在第 2 项中提到的问题 - 使用内核memcpy

于 2022-02-16T01:12:19.637 回答