Как возвратить единственную переменную из функции ядра 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);

для обеих из этих строк я получаю эту ошибку: ошибка: аргумент типа "долго" является несовместимым с параметром типа "константа пусто *"

17
задан Thomas Berger 17 August 2011 в 03:33
поделиться

2 ответа

Я использовал для этой цели переменные __ 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;
}
28
ответ дан 30 November 2019 в 11:03
поделиться

Чтобы получить единственный результат, вы должны сохранить его в памяти, например:

#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;
}

Я полагаю, что ошибка возникла из-за того, что вы передаете длинное значение вместо указателя на длинное значение.

17
ответ дан 30 November 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: