2015-07-16 3 views
1

Я новичок в программировании CUDA. Чтобы практиковать, я пытаюсь запустить очень простую программу, которая объединяет элементы в два массива, а затем сохраняет результат в новом массиве. Для организационных целей я пытаюсь сделать это, разделив код на несколько файлов. ЗАРАНЕЕ БЛАГОДАРЮ!Ошибка CUDA: ожидаемый конструктор, деструктор или преобразование типа перед 'void'

я получаю эту ошибку, когда я пытаюсь скомпилировать его: «hello.cpp: 6: ошибка: ожидается преобразование конструктор, деструктор, или типа, прежде чем" недействительным»

Вот код: hello.cpp

#include <simple.h> 
#include <stdlib.h> 
#include <stdio.h> 
#define N 100 

__global__ void add(int *a, int *b, int *c) 
{ 

    int tID = blockIdx.x; 
    if (tID < N) 
    { 
     adding(a, b, c, tID); 
    } 
} 

int main() 
{ 
    int a[N], b[N], c[N]; 
    int *dev_a, *dev_b, *dev_c; 
    cudaMalloc((void **) &dev_a, N*sizeof(int)); 
    cudaMalloc((void **) &dev_b, N*sizeof(int)); 
    cudaMalloc((void **) &dev_c, N*sizeof(int)); 
    // Fill Arrays 
    for (int i = 0; i < N; i++) 
    { 
     a[i] = i, 
    b[i] = 1; 
    } 
    cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_b, b, N*sizeof(int), cudaMemcpyHostToDevice); 
    add<<<N,1>>>(dev_a, dev_b, dev_c); 
    cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost); 
    for (int i = 0; i < N; i++) 
    { 
     printf("%d + %d = %d\n", a[i], b[i], c[i]); 
    } 
    return 0; 
} 

simple.cpp

#include <simple.h> 

__device__ void adding(int *a, int *b, int *c, int tID) 
{ 
     c[tID] = a[tID] + b[tID]; 
} 

simple.h

#ifndef __simple_h__ 
#define __simple_h__ 

__device__ void adding(int *a, int *b, int *c, int tID); 
#endif 

Makefile

objects = hello.o simple.o 

all: $(objects) 
    /usr/local/cuda-7.0/bin/nvcc -arch=sm_20 $(objects) -o app 

%.o: %.cpp %.cu 
    /usr/local/cuda-7.0/bin/nvcc -x cu -arch=sm_20 -I. -dc $< -o [email protected] 

clean: 
    rm -f *.o app 

ответ

1

Когда я запускаю свой проект на моем компьютере, make, кажется, использует его implicit variables при компиляции * .cpp файлов, что приводит при помощи g++ вместо использования nvcc, как вы указали.

Чтобы изменить это поведение, вы должны установить переменные CXX и CXXFLAGS. Следующий Makefile работал для меня:

objects = hello.o simple.o 

CXX = /usr/local/cuda-7.0/bin/nvcc 
CXXFLAGS = -x cu -arch=sm_20 -I. -dc 

all: $(objects) 
    $(CXX) $(objects) -o app 

%.o: %.cpp %.cu 
    $(CXX) $(CXXFLAGS) $< -o [email protected] 
0

Это, вероятно, из-за заявлений __global__ на файл на стороне хоста CPP. Попробуйте поместить весь код cuda в файл .cu.

+0

Есть ли способ, что я мог бы поставить только ядро ​​CUDA, где функция __gobal__ объявлен в отдельном файле .CU и оставить все остальное, где это? – spoonertaylor