如何从CUDA内核函数返回单个变量?

Pou*_*BCD 17 c cuda

我有一个CUDA搜索功能,可以计算一个变量.我怎么能把它还给我.

__global__ 
void G_SearchByNameID(node* Node, long nodeCount, long start,char* dest, long answer){
    answer = 2;
}

cudaMemcpy(h_answer, d_answer, sizeof(long), cudaMemcpyDeviceToHost);
cudaFree(d_answer);
Run Code Online (Sandbox Code Playgroud)

对于这两行我得到这个错误:错误:类型"long"的参数与类型"const void*"的参数不兼容

wic*_*ich 28

我一直在__device__为此目的使用变量,这样你就不必费心了cudaMalloc而且cudaFree你不必将指针作为内核参数传递,这样就可以在你的内核中保存一个寄存器来启动.

__device__ long d_answer;

__global__ void G_SearchByNameID() {
  d_answer = 2;
}

int main() {
  SearchByNameID<<<1,1>>>();
  typeof(d_answer) answer;
  cudaMemcpyFromSymbol(&answer, "d_answer", sizeof(answer), 0, cudaMemcpyDeviceToHost);
  printf("answer: %d\n", answer);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 出于某种原因,这只适用于我(Toolkit 6.5),如果我用`d_answer`替换`"d_answer",即删除引号.除此之外,这很好用. (4认同)

fab*_*ioM 17

要获得单个结果,您必须对其进行Memcpy,即:

#include <assert.h>

__global__ void g_singleAnswer(long* answer){ *answer = 2; }

int main(){

  long h_answer;
  long* d_answer;
  cudaMalloc(&d_answer, sizeof(long));
  g_singleAnswer<<<1,1>>>(d_answer);
  cudaMemcpy(&h_answer, d_answer, sizeof(long), cudaMemcpyDeviceToHost); 
  cudaFree(d_answer);
  assert(h_answer == 2);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想错误来了,因为你传递一个long值,而不是指向long值的指针.

  • 请注意,另一个选项*确实*执行“memcpy”(它的名称为“cudaMemcpyFromSymbol”)。这个答案使用动态分配,这对于多线程应用程序来说比使用全局变量的其他应用程序更可取。 (5认同)