#c #cuda #visual-studio-2019
#c #cuda #visual-studio-2019
Вопрос:
Игнорируйте этот вопрос — код в порядке — проблема заключалась в использовании заголовочных файлов C , которые не включены в общий пример.
Я использую Visual Studio 2019 с CUDA 11.0 и уперся в кирпичную стену, пытаясь использовать cudaSurfaceObject_t для сохранения результатов вычисления.
Я получаю следующие ошибки компилятора
Ошибка C3861 ‘surf2Dwrite’: идентификатор не найден
Ошибка C2059 синтаксическая ошибка: ‘<‘
Я наполнил include#
раздел файла .cu заголовками в тщетной попытке идентифицировать surf2Dwrite…
Мой пример версии кода представляет собой простую попытку заполнить поверхность float
значением NAN
:-
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <cuda.h>
#include <ctype.h>
#include <string.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "export.h"
#include"surface_functions.h"
__global__
void TestGrids(cudaSurfaceObject_t surf, int size)
{
int y = threadIdx.y blockIdx.y * blockDim.y;
int x = threadIdx.x blockIdx.x * blockDim.x;
if (x < size amp;amp; y < size)
{
surf2Dwrite(NAN, surf, x * 4, y);//Error C3861 'surf2Dwrite': identifier not found
}
}
void TestSurfWrite( int size)
{
cudaDeviceProp prop;
cudaError_t c_err = cudaGetDeviceProperties(amp;prop, 0);
//Set grid and block sizes
dim3 dimblock(16, 16, 1);
int gridDimX = prop.multiProcessorCount;
int gridDimY = 16;
while (gridDimX > 2 * gridDimY)
{
gridDimX = gridDimX / 2;
gridDimY = gridDimY * 2;
}
dim3 dimGrid(gridDimX, gridDimY, 1);
cudaChannelFormatDesc nanchannelDescSurf = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
cudaArray_t nanArray;
cudaMallocArray(amp;nanArray, amp;nanchannelDescSurf, size, size, 0);
struct cudaResourceDesc nanDescSurf;
memset(amp;nanDescSurf, 0, sizeof(cudaResourceDesc));
nanDescSurf.resType = cudaResourceTypeArray;
nanDescSurf.res.array.array = nanArray;
cudaSurfaceObject_t nanSurf;
cudaCreateSurfaceObject(amp;nanSurf, amp;nanDescSurf);
TestGrids<<<dimGrid, dimblock>>>(nanSurf, size); // Error C2059 syntax error: '<'
c_err = cudaGetLastError();
// perform work on nansurf here..
cudaDestroySurfaceObject(nanSurf);
cudaFreeArray(nanArray);
}
Приведенный выше код не удается собрать с ошибками, как показано. Соответствующая строка из выходных данных выглядит следующим образом:-
>Compiling CUDA source file hough.cu...
1>
1>C:devTest>"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0binnvcc.exe" -gencode=arch=compute_52,code="sm_52,compute_52" --use-local-env -ccbin "C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.27.29110binHostX86x64" -x cu -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0include" -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0include" -G --keep-dir x64Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_WINDLL -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64Debugvc142.pdb /FS /Zi /RTC1 /MDd " -o x64Debughough.cu.obj "C:devTesttest.cu"
1>test.cu
Я новичок как в C , так и в CUDA на C , поэтому я ожидаю, что здесь возникнет очевидная проблема.
talonmies определил, что это проблема, связанная с настройкой проекта, в комментариях ниже — в этой области у меня нет опыта, и я действительно не знаю, с чего начать поиск решения, поэтому я добавил тег VisualStudio-2019 в надежде, что это привлечет кого-то, кто знает об этих вещах…
Комментарии:
1. Что-то не так с настройками вашего проекта. Этот код компилируется нормально
2. Спасибо за тестирование компиляции. Я изучу настройки проекта и посмотрю, смогу ли я придумать что-нибудь еще..
3. @talonmies Я решил создать новый проект и перенести код поверх. Я вызываю код C и CUDA из программы на c #, поэтому я создавал стандартный проект CUDA Runtime 11.0 и менял тип конфигурации на динамическую библиотеку в свойствах, затем вставлял файлы CUDA C / C из диалогового окна Добавления новых элементов. — Это лучший подход или это то, что может быть причиной проблем. Есть ли способ лучше? Спасибо, Грэм
4. @talonmies — Для протокола, который не сработал — я все еще получаю те же ошибки. Какие инструкции #include мне нужны для surf2Dwrite? Может ли эта проблема быть вызвана смешиванием кода .cpp и .cu в проекте? если да, могу ли я объявить функции кода CUDA__declspec(dllexport), чтобы я мог разделить cu и cpp-код на 2 проекта. Я очень смущен!
5. Вам не нужны никакие специальные включения. Я не использую Visual Studio и не могу сказать вам, что нужно сделать, чтобы это исправить. Короче говоря: это не проблема с кодом, это проблема системы сборки
Ответ №1:
Проблема возникает из-за того, что я исказил свои заголовочные файлы. Я еще не все исправил, но в процессе переноса моего кода в simpleSurfaceWrite.cu файл (как указано в комментариях) Мне пришлось добавить файл заголовка — на этом этапе я снова начал получать перечисленные ошибки — на этот раз возникающие в simpleSurfaceWrite.cu .
По сути, пример кода, которым я поделился, был слишком упрощен, чтобы фактически воссоздать мою проблему.
Спасибо всем, кто подумал об этом.
Теперь мне нужно привести в порядок свои заголовочные файлы…
ОБНОВЛЕНИЕ: Заголовочные файлы отсортированы — код теперь создается и выполняется