Доброго время суток!
С кудой почти не сталкивался, но по долгу работы нужно освоить. Работаю с распределёнными и параллельными вычислениями. Голый куда-проект собирается вроде без проблем, но вот когда я хочу подключить куда-файлы в обычный с++ проект возникают проблемы - компилятор не подцепляет встроенные переменные threadidx и операторы <<<, >>>. Проблема наверняка не в компиляторе, а в том, что у меня что-то не настроено, или вероятно я что-то не так делаю накорню?...
Простите за грязь
код:
- //====stdafx.h=========
- #pragma once
- #include "targetver.h"
- #include <stdio.h>
- #include <tchar.h>
- #include <stdio.h>
- #include <stdlib.h>
- //#include <cuda.h>
- //#include <cutil_inline.h>
- #include <cuda_runtime.h>
- //#include <cutil.h>
- //#include <kernel.cu>
- //#include "cuda_kernel.cu"
- #include "cuda.cu"
- //====main.cpp=========
- #include "stdafx.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- float *vec3;
- vec3 = new float [SIZE];
- if(!InitCUDA)
- exit 1;
- CudaFunction(vec3);
- //Результаты расчета
- for (int i = 0; i < SIZE; i++)
- delete [] vec3;
- return 0;
- }
- //=======cuda.cu=========
- #include "stdafx.h"
- #define SIZE 512
- __global__ void addVectors(float* a, float* b, float* c)
- {
- int idx = threadIdx.x;
- c[idx] = a[idx] + b[idx];
- }
- bool InitCUDA(void)
- {
- int dcount = 0;
- int i = 0;
- cudaGetDeviceCount(&dcount);
- if(dcount == 0) {
- fprintf(stderr, "There is no device.\n");
- return false;
- }
- for(i = 0; i < dcount; i++) {
- cudaDeviceProp prop;
- if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
- if(prop.major >= 1) {
- break;
- }
- }
- }
- if(i == dcount) {
- fprintf(stderr, "There is no device supporting CUDA.\n");
- return false;
- }
- cudaSetDevice(i);
- return true;
- }
- __host__ void CudaFunction(float* vec3/*LPHANDLE *lphCouldGetResult, LPHANDLE *lphWeHaveGotResult*/)
- {
- //Выделяем память под вектора
- float* vec1 = new float[SIZE];
- float* vec2 = new float[SIZE];
- //float* vec3 = new float[SIZE];
- //Инициализируем значения векторов
- for (int i = 0; i < SIZE; i++)
- {
- vec1[i] = (float)i;
- vec2[i] = (float)i;
- }
- //Указатели на память видеокарте
- float* devVec1;
- float* devVec2;
- float* devVec3;
- //Выделяем память для векторов на видеокарте
- cudaMalloc((void**)&devVec1, sizeof(float) * SIZE);
- cudaMalloc((void**)&devVec2, sizeof(float) * SIZE);
- cudaMalloc((void**)&devVec3, sizeof(float) * SIZE);
- //Копируем данные в память видеокарты
- cudaMemcpy(devVec1, vec1, sizeof(float) * SIZE, cudaMemcpyHostToDevice);
- cudaMemcpy(devVec2, vec2, sizeof(float) * SIZE, cudaMemcpyHostToDevice);
- dim3 gridSize = dim3(1, 1, 1); //Размер используемого грида
- dim3 blockSize = dim3(SIZE, 1, 1); //Размер используемого блока
- //Выполняем вызов функции ядра
- addVectors<<<gridSize, blockSize>>>(devVec1, devVec2, devVec3);
- //Хендл event'а
- cudaEvent_t syncEvent;
- cudaEventCreate(&syncEvent); //Создаем event
- cudaEventRecord(syncEvent, 0); //Записываем event
- cudaEventSynchronize(syncEvent); //Синхронизируем event
- //Только теперь получаем результат расчета
- cudaMemcpy(vec3, devVec3, sizeof(float) * SIZE, cudaMemcpyDeviceToHost);
- //
- // Высвобождаем ресурсы
- //
- cudaEventDestroy(syncEvent);
- cudaFree(devVec1);
- cudaFree(devVec2);
- cudaFree(devVec3);
- delete[] vec1; vec1 = 0;
- delete[] vec2; vec2 = 0;
- //delete[] vec3; vec3 = 0;
- //return 0;
- }
output:
- 1>------ Build started: Project: cuda_test, Configuration: Debug Win32 ------
- 1>Compiling...
- 1>stdafx.cpp
- 1>c:\documents and settings\***\мои документы\visual studio 2008\projects\cuda_test\cuda_test\cuda.cu(7) : error C2065: 'threadIdx' : undeclared identifier
- 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
- 1> type is ''unknown-type''
- 1>c:\documents and settings\***\мои документы\visual studio 2008\projects\cuda_test\cuda_test\cuda.cu(72) : error C2059: syntax error : '<'
- 1>Build log was saved at "file://c:\Documents and Settings\***\ои документы\Visual Studio 2008\Projects\cuda_test\cuda_test\Debug\BuildLog.htm"
- 1>cuda_test - 3 error(s), 0 warning(s)
- ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Comments
У Вас не видны остальные хедеры CUDA, кроме cuda.h и cuda_runtime.h есть другие хедеры, на них указан путь в include path ? Возможно также, что Вы не выставили компилятор NVCC для работы.