Saya sedang menulis kode cuda sederhana ini dan saya tidak dapat mengompilasinya. Kode berisi bagian dari kode yang ditulis dalam C. Ini adalah struktur program:

Read_data.c file berisi fungsi yang disebut read_data file add.cu berisi fungsi yang disebut add (ini adalah bagian yang harus dijalankan di GPGPU) file optimize.h berisi header yang diperlukan. file master.c berisi fungsi utama.

File optimize.h terlihat seperti berikut:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
#include <time.h>

__global__ void add(int, float*, float*);
void read_data(char*, float**, float**, int**);

File master.c terlihat seperti berikut:

#include "optimize.h"

int main(){
    char* path = "./data/0";
    float* base_load;
    float* comfortable_temperatures;
    int* comfort_index;

    read_data(path, &base_load, &comfortable_temperatures, &comfort_index);
    int N = 1<<20;
    float *x, *y;
    int i;

    cudaMallocManaged(&x, N*sizeof(float));
    cudaMallocManaged(&y, N*sizeof(float));
  
    for (i = 0; i < N; i++) {
       x[i] = 1.0f;
       y[i] = 2.0f;
    }
    add<<<1, 256>>>(N, x, y);

    cudaDeviceSynchronize();

    // still need to read the result back.

    cudaFree(x);
    cudaFree(y);
   }

Saya mengkompilasi ini menggunakan baris berikut:

nvcc -o master master.c read_data.c add.cu

Dan saya mendapatkan kesalahan ini:

In file included from master.c:1:0:
optimize.h:9:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
 __global__ void add(int, float*, float*);
            ^
master.c: In function ‘main’:
master.c:51:26: error: ‘add’ undeclared (first use in this function)
                          add<<<1, 256>>>(N, x, y);
                          ^
master.c:51:26: note: each undeclared identifier is reported only once for each function it appears in
master.c:51:31: error: expected expression before ‘<’ token
                          add<<<1, 256>>>(N, x, y);

Saya pikir apa pun kesalahannya, itu harus sangat kecil. Tapi saya tidak bisa menemukannya.

1
PPGoodMan 19 November 2020, 23:44

1 menjawab

Jawaban Terbaik

nvcc secara default memperlakukan nama file yang diakhiri dengan .c atau .cpp sebagai tidak memiliki sintaks khusus CUDA, dan mengirimkannya ke kompiler host. Kompiler host tidak dapat menangani sintaks khusus CUDA, itulah sebabnya Anda mendapatkan kesalahan.

Rekomendasi yang biasa adalah menempatkan kode CUDA Anda dalam file yang diakhiri dengan .cu. Sebagai alternatif, Anda dapat meneruskan -x cu sebagai sakelar kompilasi untuk melakukan ini.

Perhatikan bahwa nvcc menggunakan tautan gaya c++, jadi Anda perlu mengatur tautan gaya-c yang benar jika Anda mencoba menautkan kode dalam file .cu dengan kode dalam file .c. Jika Anda tidak memiliki penggunaan khusus C, sekali lagi, solusi sederhana mungkin adalah mengganti nama file .c Anda menjadi .cpp atau .cu.

Ada banyak pertanyaan di sini pada tag cuda yang menjelaskan bagaimana melakukan hubungan C++/C, jika tidak.

2
Robert Crovella 20 November 2020, 15:29