web-dev-qa-db-ja.com

CUDAカーネル関数から単一の変数を返す方法は?

1つの変数を計算する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);

これらの行の両方で、次のエラーが発生します。エラー:「long」型の引数は「constvoid *」型のパラメーターと互換性がありません

18
Pouya BCD

私はこの目的のために__device__変数を使用してきました。そうすれば、cudaMalloccudaFreeを気にする必要がなく、ポインターをとして渡す必要もありません。カーネル引数。起動するカーネルにレジスタを保存します。

__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;
}
26
wich

単一の結果を得るには、それを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;
}

長い値へのポインタではなく、長い値を渡したためにエラーが発生したと思います。

15
fabrizioM