Я пытаюсь скомпилировать проект CUDA, который выдает ошибку 255, как только я пытаюсь запустить функцию, определенную в отдельном файле .cu
Здесь определено основное ядро
#include <curand_kernel.h>
#include <ctime>
#include <stdio.h>
#include "Scene.cuh"
__global__ void fill(float *c, Scene* scene)
{
int index = blockIdx.y * blockDim.x * blockDim.y * gridDim.x +
threadIdx.y * blockDim.x * gridDim.x +
blockIdx.x * blockDim.x + threadIdx.x;// this is the line which gives the compilation error
float3 result = scene->computeRayFromIndex(index);
c[index * 4 + 0] += 1.0f;
c[index * 4 + 1] += 1.0f;
c[index * 4 + 2] += 1.0f;
c[index * 4 + 3] += 1.0f;
}
Вот сцена.
#ifndef Scene_h
#define Scene_h
#include "cuda_runtime.h"
class Scene {
public:
Scene();
__host__ __device__ float3 computeRayFromIndex(int);
int width;
int height;
int cameraType;
private:
};
#endif
И scene.cu
#include "Scene.cuh"
Scene::Scene() {
}
__host__ __device__ float3 Scene::computeRayFromIndex(int pixelIndex) {
float3 test;
return test;
}
Я использую Visual Studio 2013 и добавляю файлы CUDA в свой проект как обычно из меню
Это ошибка компиляции
Error 10 error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -G --keep-dir x64\Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /FS /Zi /RTC1 /MDd " -o x64\Debug\fillRandomTexture.cu.obj "D:\CUDA\projects\vRay\vRay\fillRandomTexture.cu"" exited with code 255.
Проект строится и работает нормально, если я закомментирую
float3 result = scene->computeRayFromIndex(index);
В основном файле ядра
В CUDA, когда мы хотим вызвать функцию кода устройства из другой функции кода устройства, и эти две функции кода устройства находятся в отдельных блоках компиляции, необходимо включить генерация и привязка кода перемещаемого устройства при составлении такого проекта.
В Visual Studio это может быть установлено для всего проекта со страницы свойств проекта, как указано Вот:
Кроме того, при работе с Visual Studio и CUDA ошибка «MSB3721» является неспецифической ошибкой от Visual Studio, указывающей «Я запустил nvcc
и он вернул ошибку «. Однако фактическая ошибка из nvcc
должно произойти до этого. Если вы не видите его в окне вывода компиляции непосредственно перед ошибкой «MSB3721», то ваш уровень детализации слишком низок. Вы можете увеличить его, и точный способ сделать это будет немного отличаться в зависимости от версии VS, поэтому я рекомендую выполнить поиск того, как это сделать, для вашей конкретной версии.
Других решений пока нет …