Как заставить surf2Dwrite корректно компилироваться в C CUDA

#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 .

По сути, пример кода, которым я поделился, был слишком упрощен, чтобы фактически воссоздать мою проблему.

Спасибо всем, кто подумал об этом.
Теперь мне нужно привести в порядок свои заголовочные файлы…

ОБНОВЛЕНИЕ: Заголовочные файлы отсортированы — код теперь создается и выполняется