По сути, у меня есть компилятор, компилирующий мои файлы .cu, и у меня (я думаю) полная работа с этими файлами .cu, но когда я пытаюсь их вызвать (kernel<<<1,1>>>(void)
), компилятор регистрирует синтаксические ошибки из-за синтаксиса CUDA. Кроме того, такие вызовы, как cudaMalloc, не работают в файлах c.
Вот три очень коротких файла, так что я могу сказать вам, где ошибка.
//kernel.cu
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime_api.h>
__global__ int kernel(void){
return 5;
}
и
//kernel.h
#ifndef _KERNEL_h_
#define _KERNEL_h_
extern "C" int kernel(void);
#endif
и
//main.c
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime_api.h>
int main() {
int* device_a;
cudaMalloc( (void**)&device_a, sizeof(int) );
kernel<<<1,1>>>();
}
Я получил заголовочный файл из некоторых примеров SDK. Кроме того, у меня есть конфигурация сборки с CUDA 4.2, поэтому файл .cu компилируется. Если я сделал какие-либо случайные синтаксические ошибки, то это потому, что я упростил его для публикации, а не потому, что он действительно есть в исходнике, хотя, пожалуйста, укажите это на всякий случай.
kernel.cu компилируется нормально.
В kernel.h есть ошибка: «ошибка C2059: синтаксическая ошибка:« строка »» в строке «extern ...». (Может быть, это потому, что я взял это из примера на С++?)
main.c имеет ошибку: «ошибка C2065:« ядро »: необъявленный идентификатор»
и: "ошибка C2059: синтаксическая ошибка: '‹'"
но когда я комментирую вызов ядра, так что это просто cudaMalloc, я получаю: «ошибка LNK2019: неразрешенный внешний символ _cudaMalloc@8, на который ссылается функция _main»
и: "фатальная ошибка LNK1120: 1 неразрешенный внешний"
Это что-то с Visual Studio 2010 или что-то, что я не включаю? Из примеров SDK я не могу сказать, что я делаю неправильно, кроме того, они нашли способ, я думаю, не использовать тройную скобку (CTRL + F не находит). Любая помощь приветствуется. Заранее спасибо!
РЕДАКТИРОВАТЬ: посмотрев еще несколько примеров, они прекрасно используют синтаксис тройной скобки.
РЕДАКТИРОВАТЬ: Для тех, кто использует это как ссылку, функции __global__
могут возвращать только void. Если вы попытаетесь вернуть что-то еще, как это сделал я, вы получите ошибки компилятора.