2017-01-02 6 views
0

Я новичок в Cuda и только что начал писать простую программу для ее проверки. В нем, вероятно, много проблем, но сейчас для меня стоппер - это ошибка, которую я описал в названии: всякий раз, когда я объявляю простую переменную cudaError_t, я получаю ошибку компиляции «Unrecognized token». Вот мой пример кода:Непризнанная ошибка токена при объявлении переменной cudaError_t

#include <cuda_runtime.h> 
#include <cuda_runtime_api.h> 

extern "C" void callCudaCode(int*); 

__global__ void mykernel (int *a, int *b, int *c) 
{ 
    //*c = *a + *b; 
    *c = 34; 
} 


void callCudaCode(int* results) 
{ 
    int a=3, b=8; 
    int *da, *db, *dc; 
    int size = sizeof(int); 

    ​cudaError_t myCudaError;// = cudaGetLastError(); 
    //const char* errorStr = cudaGetErrorName(cudaError); 

    cudaMalloc((void**)da, size); 
    cudaMalloc((void**)db, size); 
    cudaMalloc((void**)dc, size); 

    cudaMemcpy(da, &a, size, cudaMemcpyHostToDevice); 
    cudaMemcpy(db, &b, size, cudaMemcpyHostToDevice); 

    mykernel<<<1,1>>>(da,db,dc); 

    cudaMemcpy(results, dc, size, cudaMemcpyDeviceToHost); 

    cudaFree(da); 
    cudaFree(db); 
    cudaFree(dc); 
} 

Существует еще один main.cpp файл, который использует эти файлы, но я не думаю, что это имеет какое-либо соответствующее объяснить эту ошибку, так что я не включил его. Если я комментирую объявление переменной cudaError_t, код компилируется отлично (это не выполняется отлично, но это еще одна история).

Я уже гугл этой проблемы, но только обнаружил ошибки, которые не имеют ничего общего с моим, например: космическими ошибками, PRINTF ошибки ...

Из того, что я понимаю, cudaError_t это перечисление, который определенный в cuda_runtime_api.h, поэтому, включив его, у меня не должно быть никаких проблем ...

У кого-нибудь есть ключ к тому, что происходит?

EDIT

Файл Я просто прилагается mycuda.cu. Существует еще один файл с именем main.cpp, который просто вызывает функцию callCudaCode() из mycuda.cu. Я использую Qt Creator и qmake для создания проекта. Да, я позаботился о настройке файла .pro, чтобы Qt не пытался скомпилировать проект .cu. Если я прокомментирую строку, объявляющую переменную myCudaError, проект компилируется отлично. Если я раскомментирую это, я получаю проблему с компиляцией.

+0

Какое имя файла находится в вопросе - используете ли вы имя файла, которое заканчивается на '.cpp'? – tera

+0

Этот файл cuda.cu. Существует еще один файл main.cpp, который просто вызывает callCudaCode() из этого файла. –

+0

Если файл имеет расширение '.cu', то время выполнения CUDA не требуется - nvcc будет автоматически включать заголовки CUDA. – tera

ответ

1

Линия

​cudaError_t myCudaError;// = cudaGetLastError(); 

, кажется, есть Unicode 0x200B «нулевая ширина пробела» до cudaError_t. Удалите его (или удалите и повторно введите всю строку, если не уверены), и повторите попытку.

+0

Вот и все. Не знаю, как это место оказалось там, но это была проблема. Спасибо, Тера! –

5

cudaError - зарезервированное ключевое слово CUDA.

Не используйте это имя переменной.

Изменить его на что-то вроде:

cudaError_t my_cudaError; 

(cudaError уже определен в driver_types.h Это перечисление.).

+0

Спасибо, Роберт за ваш ответ, я не знал об этом. Я просто переименовал переменную в myCudaError, но проблема все еще остается. Любая другая идея? Кстати, я использую QtCreator и qmake для создания проекта.Поскольку он строит без строки объявления переменных, я полагаю, это не поможет, но если кто-то почувствует, что это может помочь диагностировать ошибку, просто скажите мне, и я скажу. –

+0

Как и CUDA, QT также представляет свои собственные шаги предварительной обработки, которые в моем (ограниченном) опыте несовместимы с CUDA. Поэтому лучше всего убедитесь, что QT обрабатывает только файлы '.cpp' и что весь код CUDA ограничен файлами' .cu'. – tera

+0

Уже сделал это. Он QT должен был обрабатывать файл .cu, было бы много ошибок компиляции (которые присутствовали до того, как я решил эту проблему). –