Wie kann ich eine einzelne Variable von einer CUDA-Kernel-Funktion zurückgeben?

Lesezeit: 2 Minuten

Benutzeravatar von Pouya BCD
Pouya BCD

Ich habe eine CUDA-Suchfunktion, die eine einzelne Variable berechnet. Wie kann ich es zurückgeben.

__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);

Für beide Zeilen erhalte ich diesen Fehler: Fehler: Argument vom Typ „long“ ist nicht kompatibel mit Parameter vom Typ „const void *“

Ich habe verwendet __device__ Variablen für diesen Zweck, so dass Sie sich nicht darum kümmern müssen cudaMalloc und cudaFree und Sie müssen keinen Zeiger als Kernel-Argument übergeben, was Ihnen ein Register in Ihrem Kernel zum Booten erspart.

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

  • @Erogol Sowohl der Kernel als auch der Hostcode kennen den Typ aus der __device__ Erklärung

    – welche

    8. März 2013 um 23:48 Uhr

  • Aus irgendeinem Grund funktioniert dies bei mir (Toolkit 6.5) nur, wenn ich ersetze "d_answer" mit d_answer, dh die Anführungszeichen entfernen. Abgesehen davon funktioniert das gut.

    – icurays1

    26. Mai 2015 um 7:41 Uhr

  • Der Wert kommt bei mir immer als Null zurück.

    – orodbhen

    5. September 2016 um 11:06 Uhr

  • Kann A __device__ Variable Thread-lokal sein? Solche globalen Variablen funktionieren nicht für Multithread-Anwendungen.

    – Serge Rogatch

    10. September 2016 um 19:15 Uhr

  • Dieser Ansatz ist nicht “reentrant” in dem Sinne, dass Starts desselben Kernels aus mehreren Streams nicht unterstützt werden.

    – einpoklum

    31. Mai 2019 um 22:19 Uhr

Um ein einzelnes Ergebnis zu erhalten, müssen Sie es Memcpy machen, dh:

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

Ich denke, der Fehler kommt, weil Sie einen langen Wert anstelle eines Zeigers auf einen langen Wert übergeben.

  • Du nicht haben zu memcpy() – Es gibt andere Optionen, wie z. B. die Antwort von @wich . -1, es sei denn, Sie argumentieren, dass Kopieren die beste / einzig realistische Option ist.

    – einpoklum

    31. Mai 2019 um 22:19 Uhr

  • Beachten Sie, dass die andere Option tut mach ein memcpy (Es ist im Namen cudaMemcpyFromSymbol). Diese Antwort verwendet die dynamische Zuordnung, die für Multithread-Anwendungen vorzuziehen ist, gegenüber der anderen, die eine globale Variable verwendet.

    – rgov

    29. Februar 2020 um 2:49 Uhr

1433440cookie-checkWie kann ich eine einzelne Variable von einer CUDA-Kernel-Funktion zurückgeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy