2017-02-25 8 views
-1

Ich habe meinen Code-Fehler - erhalte ich die Fehlermeldung „Fehler: expected a ")"Fehler bei Zufallsfunktion

dieser Fehler kommt becuse von random_ints funktionieren

#include <assert.h> 
#include <cuda.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <stddef.h> 
#include <time.h> 


#define N (1024*1024) 
#define M (1000000) 

void random_ints(int *a, int N) 
{ 
    int i; 
    for (i = 0; i < M; ++i) 
    a[i] = rand() %5000; 
} 


__global__ void add(int *a, int *b, int *c) { 
     c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x]; 
    } 


    int main(void) { 
    int *a, *b, *c;  // host copies of a, b, c 
    int *d_a, *d_b, *d_c; // device copies of a, b, c 
    int size = N * sizeof(int); 

    // Alloc space for device copies of a, b, c 
    cudaMalloc((void **)&d_a, size); 
    cudaMalloc((void **)&d_b, size); 
    cudaMalloc((void **)&d_c, size); 

    // Alloc space for host copies of a, b, c and setup input values 
    a = (int *)malloc(size); random_ints(a, N); 
    b = (int *)malloc(size); random_ints(b, N); 
    c = (int *)malloc(size); 
     // Copy inputs to device 
     cudaMemcpy(d_a, a, size, cudaMemcpyHostToDevice); 
     cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice); 

     // Launch add() kernel on GPU with N blocks 
     add<<<N,1>>>(d_a, d_b, d_c); 

     // Copy result back to host 
     cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost); 

     // Cleanup 
     free(a); free(b); free(c); 
     cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); 
     return 0; 
    } 

ist.. Gibt es einen für diese Funktion erforderlichen Header oder nur einen Syntaxfehler?

+1

empfehle ich 'static const int N mit = ...' statt '#define N ...' für numerische Konstanten. Die Verwendung von Defines kann leicht zu schwer zu verstehenden Fehlern am Standort führen, den Sie am wenigsten erwarten. – CygnusX1

+0

* Unter der Voraussetzung „dieser Fehler kommt becuse von random_ints Funktion“ * ist genau, 'Mann 3 rand' sagt Ihnen,' # include zu verwenden '. Es sieht so aus, als ob du den richtigen Header hast. Es scheint, dass Sie einen Tippfehler in der Funktion haben. Der Funktionsparameter ist *** 'N' ***, aber Sie haben ***' M' *** in der Schleife verwendet. – jww

Antwort

3

Überlegen Sie, wie random_ints definiert werden würde, nachdem die #define Makros interpretiert wurden:

void random_ints(int *a, int (1024*1024)) 
{ 
    int i; 
    for (i = 0; i < 1000000; ++i) 
    a[i] = rand() %5000; 
} 

Offensichtlich können Sie ein numerisches Literal in einer Funktionserklärung wie diesem nicht angeben.

Es scheint, als ob der zweite Parameter die Größe des Arrays sein sollte. Sie können es n rufen mit N zu kollidieren:

void random_ints(int *a, int n) 
{ 
    int i; 
    for (i = 0; i < n; ++i) 
     a[i] = rand() %5000; 
}