@ivandzemianchyk

Как собрать проект в С++ с реализацией части кода в CUDA?

Возможно, что проблема в компиляторе:
Использую Visual Studio 2010

Просмотрел несколько туториалов, все выглядят примерно одинаково, но сделав те шаги о которых там пишут пока к успеху не привели.
Если функция main() находиться в .cu файле то всё работает без проблем, но когда пытаюсь её вызвать из файла .cpp то появляются проблемы при компиляции.
Ниже проедставлю пример:
//test.cu
#include <stdio.h>
#include "hello.cuh"

 int main()
{
	hello();
	system("pause");
	return 0;
}

и
//hello.cuh
#include <cuda.h>
#include <stdio.h>

__global__ void helloWorld(char* str)
{
	int idx = blockIdx.x * blockDim.x + threadIdx.x;
	str[idx] += idx;
}

 void hello()
{
	int i;
	char str[] = "Start!";
	for(i = 0; i < 6; i++)
		str[i] -= i;
	char *d_str;
	int size = sizeof(str);
	cudaMalloc((void**)&d_str, size);
	cudaMemcpy(d_str, str, size, cudaMemcpyHostToDevice);
	dim3 dimGrid(2);
	dim3 dimBlock(3);
	helloWorld<<< dimGrid, dimBlock >>>(d_str);
	cudaMemcpy(str, d_str, size, cudaMemcpyDeviceToHost);
	cudaFree(d_str);
	printf("\n%s\n", str);
}


Всё работает нормально. Но если я пытаюсь создать новый .cpp вайл и вставить туда тот же код из test.cu, то появляются ошибки выписанные внизу:

1> main.cpp
1>e:\inzynierka\v5\hello.cuh(4): error C2144: syntax error : 'void' should be preceded by ';'
1>e:\inzynierka\v5\hello.cuh(4): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\inzynierka\v5\hello.cuh(7): error C2065: 'blockIdx' : undeclared identifier
1>e:\inzynierka\v5\hello.cuh(7): error C2228: left of '.x' must have class/struct/union
1> type is ''unknown-type''
1>e:\inzynierka\v5\hello.cuh(7): error C2065: 'blockDim' : undeclared identifier
1>e:\inzynierka\v5\hello.cuh(7): error C2228: left of '.x' must have class/struct/union
1> type is ''unknown-type''
1>e:\inzynierka\v5\hello.cuh(7): error C2065: 'threadIdx' : undeclared identifier
1>e:\inzynierka\v5\hello.cuh(7): error C2228: left of '.x' must have class/struct/union
1> type is ''unknown-type''
1>e:\inzynierka\v5\hello.cuh(20): error C3861: 'cudaMalloc': identifier not found
1>e:\inzynierka\v5\hello.cuh(21): error C2065: 'cudaMemcpyHostToDevice' : undeclared identifier
1>e:\inzynierka\v5\hello.cuh(21): error C3861: 'cudaMemcpy': identifier not found
1>e:\inzynierka\v5\hello.cuh(22): error C2065: 'dim3' : undeclared identifier
1>e:\inzynierka\v5\hello.cuh(22): error C2146: syntax error : missing ';' before identifier 'dimGrid'
1>e:\inzynierka\v5\hello.cuh(22): error C3861: 'dimGrid': identifier not found
1>e:\inzynierka\v5\hello.cuh(23): error C2065: 'dim3' : undeclared identifier
1>e:\inzynierka\v5\hello.cuh(23): error C2146: syntax error : missing ';' before identifier 'dimBlock'
1>e:\inzynierka\v5\hello.cuh(23): error C3861: 'dimBlock': identifier not found
1>e:\inzynierka\v5\hello.cuh(24): error C2059: syntax error : '<'
1>e:\inzynierka\v5\hello.cuh(25): error C2065: 'cudaMemcpyDeviceToHost' : undeclared identifier
1>e:\inzynierka\v5\hello.cuh(25): error C3861: 'cudaMemcpy': identifier not found
1>e:\inzynierka\v5\hello.cuh(26): error C3861: 'cudaFree': identifier not found
1>
1>Build FAILED.


В разных туториалах пишут о файле usertype.dat который должен убрать все подчёркивания неизвестных символов( вроде __global__ или blockIdx.x ), так вот этого файла я не нашёл, но по сути он не на что не должен влиять.

Я знаю что много туториалов, но уже n-часов просидел наж этой проблемой и пока без результатов, что-то я делаю не так.

P.S. При попытке запустить CUDA_VS_Wizard выскакивает ошибка Can't find Visual Studio install directory
  • Вопрос задан
  • 3346 просмотров
Решения вопроса 1
@ivandzemianchyk Автор вопроса
(Не знаю или это важно) Но поделил код CUDA на .cu и .cuh

Но на 100% ВАЖНО!
Если мы создаём файл .cu либо .cuh раньше чем ставим галочку в Build Customization, то нужно зайти в настройки файла и выбрать тип файла:
Properties -> General -> Item Type -> (Выбираем "CUDA C/C++)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы