Проблема при сборке проекта Win32 Console Application + CUDA

Доброго время суток!

С кудой почти не сталкивался, но по долгу работы нужно освоить. Работаю с распределёнными и параллельными вычислениями. Голый куда-проект собирается вроде без проблем, но вот когда я хочу подключить куда-файлы в обычный с++ проект возникают проблемы - компилятор не подцепляет встроенные переменные threadidx и операторы <<<, >>>. Проблема наверняка не в компиляторе, а в том, что у меня что-то не настроено, или вероятно я что-то не так делаю накорню?...

Простите за грязь

код:

  1. //====stdafx.h=========
  2. #pragma once
  3.  
  4. #include "targetver.h"
  5.  
  6. #include <stdio.h>
  7. #include <tchar.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. //#include <cuda.h>
  11. //#include <cutil_inline.h>
  12. #include <cuda_runtime.h>
  13. //#include <cutil.h>
  14. //#include <kernel.cu>
  15. //#include "cuda_kernel.cu"
  16. #include "cuda.cu"
  1. //====main.cpp=========
  2. #include "stdafx.h"
  3.  
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.         float *vec3;
  7.         vec3 = new float [SIZE];
  8.         if(!InitCUDA)
  9.                 exit 1;
  10.         CudaFunction(vec3);
  11.         //Результаты расчета
  12.         for (int i = 0; i < SIZE; i++)
  13.                 printf("Element #%i: %.1f\n", i , vec3[i]);
  14.        
  15.         delete [] vec3;
  16.         return 0;
  17. }
  1. //=======cuda.cu=========
  2. #include "stdafx.h"
  3.  
  4. #define SIZE 512
  5.  
  6. __global__ void addVectors(float* a, float* b, float* c)
  7. {
  8.         int idx = threadIdx.x;
  9.         c[idx] = a[idx] + b[idx];
  10. }
  11.  
  12. bool InitCUDA(void)
  13. {
  14.     int dcount = 0;
  15.     int i = 0;
  16.  
  17.     cudaGetDeviceCount(&dcount);
  18.     if(dcount == 0) {
  19.         fprintf(stderr, "There is no device.\n");
  20.         return false;
  21.     }
  22.  
  23.     for(i = 0; i < dcount; i++) {
  24.         cudaDeviceProp prop;
  25.         if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
  26.             if(prop.major >= 1) {
  27.                 break;
  28.             }
  29.         }
  30.     }
  31.     if(i == dcount) {
  32.         fprintf(stderr, "There is no device supporting CUDA.\n");
  33.         return false;
  34.     }
  35.     cudaSetDevice(i);
  36.  
  37.     printf("CUDA initialized.\n");
  38.     return true;
  39. }
  40.  
  41. __host__ void CudaFunction(float* vec3/*LPHANDLE *lphCouldGetResult, LPHANDLE *lphWeHaveGotResult*/)
  42. {
  43.         //Выделяем память под вектора
  44.         float* vec1 = new float[SIZE];
  45.         float* vec2 = new float[SIZE];
  46.         //float* vec3 = new float[SIZE];
  47.  
  48.         //Инициализируем значения векторов
  49.         for (int i = 0; i < SIZE; i++)
  50.         {
  51.                 vec1[i] = (float)i;
  52.                 vec2[i] = (float)i;
  53.         }
  54.  
  55.         //Указатели на память видеокарте
  56.         float* devVec1;
  57.         float* devVec2;
  58.         float* devVec3;
  59.  
  60.         //Выделяем память для векторов на видеокарте
  61.         cudaMalloc((void**)&devVec1, sizeof(float) * SIZE);
  62.         cudaMalloc((void**)&devVec2, sizeof(float) * SIZE);
  63.         cudaMalloc((void**)&devVec3, sizeof(float) * SIZE);
  64.  
  65.         //Копируем данные в память видеокарты
  66.         cudaMemcpy(devVec1, vec1, sizeof(float) * SIZE, cudaMemcpyHostToDevice);
  67.         cudaMemcpy(devVec2, vec2, sizeof(float) * SIZE, cudaMemcpyHostToDevice);
  68.        
  69.         dim3 gridSize = dim3(1, 1, 1);    //Размер используемого грида
  70.         dim3 blockSize = dim3(SIZE, 1, 1); //Размер используемого блока
  71.  
  72.         //Выполняем вызов функции ядра
  73.         addVectors<<<gridSize, blockSize>>>(devVec1, devVec2, devVec3);
  74.        
  75.         //Хендл event'а
  76.         cudaEvent_t syncEvent;
  77.  
  78.         cudaEventCreate(&syncEvent);    //Создаем event
  79.         cudaEventRecord(syncEvent, 0);  //Записываем event
  80.         cudaEventSynchronize(syncEvent);  //Синхронизируем event
  81.  
  82.         //Только теперь получаем результат расчета
  83.         cudaMemcpy(vec3, devVec3, sizeof(float) * SIZE, cudaMemcpyDeviceToHost);
  84.        
  85.         //
  86.         // Высвобождаем ресурсы
  87.         //
  88.  
  89.         cudaEventDestroy(syncEvent);
  90.  
  91.         cudaFree(devVec1);
  92.         cudaFree(devVec2);
  93.         cudaFree(devVec3);
  94.  
  95.         delete[] vec1; vec1 = 0;
  96.         delete[] vec2; vec2 = 0;
  97.         //delete[] vec3; vec3 = 0;
  98.  
  99.         //return 0;    
  100. }

output:

  1. 1>------ Build started: Project: cuda_test, Configuration: Debug Win32 ------
  2. 1>Compiling...
  3. 1>stdafx.cpp
  4. 1>c:\documents and settings\***\мои документы\visual studio 2008\projects\cuda_test\cuda_test\cuda.cu(7) : error C2065: 'threadIdx' : undeclared identifier
  5. 1>c:\documents and settings\***\мои документы\visual studio 2008\projects\cuda_test\cuda_test\cuda.cu(7) : error C2228: left of '.x' must have class/struct/union
  6. 1>        type is ''unknown-type''
  7. 1>c:\documents and settings\***\мои документы\visual studio 2008\projects\cuda_test\cuda_test\cuda.cu(72) : error C2059: syntax error : '<'
  8. 1>Build log was saved at "file://c:\Documents and Settings\***\Мои документы\Visual Studio 2008\Projects\cuda_test\cuda_test\Debug\BuildLog.htm"
  9. 1>cuda_test - 3 error(s), 0 warning(s)
  10. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Forums: 

У Вас не видны остальные

У Вас не видны остальные хедеры CUDA, кроме cuda.h и cuda_runtime.h есть другие хедеры, на них указан путь в include path ? Возможно также, что Вы не выставили компилятор NVCC для работы.