So kopieren Sie den in der Gerätefunktion zugewiesenen Speicher zurück in den Hauptspeicher

Ich habe ein CUDA-Programm, das eine Host- und eine Gerätefunktion enthältAusführen(). In der Host-Funktion reserviere ich einen globalen SpeicherAusgabe Diese werden dann an die Gerätefunktion übergeben und zum Speichern der Adresse des globalen Speichers verwendet, der in der Gerätefunktion zugeordnet ist. Ich möchte auf den im Kernel zugewiesenen Speicher in der Host-Funktion zugreifen. Das Folgende ist der Code:

#include <stdio.h>
typedef struct                      
{
  int             * p;            
  int              num;            
} Structure_A;

__global__ void Execute(Structure_A *output);

int main(){

    Structure_A *output;
    cudaMalloc((void***)&output,sizeof(Structure_A)*1);
    dim3 dimBlockExecute(1,1);
    dim3 dimGridExecute(1,1);
    Execute<<<dimGridExecute,dimBlockExecute>>>(output);
    Structure_A * output_cpu;
    int * p_cpu;
    cudaError_t err;

    output_cpu= (Structure_A*)malloc(sizeof(Structure_A));
    err=cudaMemcpy(output_cpu,output,sizeof(Structure_A),cudaMemcpyDeviceToHost);    
    if( err != cudaSuccess)
    {
        printf("CUDA error a: %s\n", cudaGetErrorString(err));
        exit(-1);
    }
    p_cpu=(int *)malloc(sizeof(int));
    err=cudaMemcpy(p_cpu,output_cpu[0].p,sizeof(int),cudaMemcpyDeviceToHost);    
    if( err != cudaSuccess)
    {
        printf("CUDA error b: %s\n", cudaGetErrorString(err));
        exit(-1);
    }   
    printf("output=(%d,%d)\n",output_cpu[0].num,p_cpu[0]);
    return 0;
}

__global__ void Execute(Structure_A *output){

    int thid=threadIdx.x;

    output[thid].p= (int*)malloc(thid+1);

    output[thid].num=(thid+1);

    output[thid].p[0]=5;
} 

Ich kann das Programm kompilieren. Beim Ausführen wurde jedoch eine Fehlermeldung angezeigt, dass die folgende Speicherkopierfunktion ein ungültiges Argument enthält:

err=cudaMemcpy(p_cpu,output_cpu[0].p,sizeof(int),cudaMemcpyDeviceToHost); 

CUDA-Version ist 4.2. CUDA-Karte: Tesla C2075 Betriebssystem: x86_64 GNU / Linux

Bearbeiten: Der Code wurde geändert und die richtige Speichergröße für output_cpu und p_cpu zugewiesen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage