C cuda инвертирует цвета изображения

#c #opencv #image-processing #cuda #gpu

#c #opencv #обработка изображений #cuda #графический процессор

Вопрос:

Я очень новичок в программировании на cuda, и я пытаюсь инвертировать цвета изображения с помощью c cuda и overcv, но я сделал все возможное, решая ошибку за ошибкой, пока не зашел в тупик, пожалуйста, помогите. Среда настроена на выпуск x64, я включил пути к библиотекам и включил как cuda, так и open cv, а также все библиотеки, необходимые для ввода компоновщика.

 #include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "C:UsersUSERsourcereposcudatry2cudatry2Inversion_CUDA.h"

using namespace std;
using namespace cv;

int main() {
    Mat Input_Image = imread("C:\Users\USER\source\repos\cudatry2\cudatry2\Test_Image.png");

    cout << "Height: " << Input_Image.rows << ", Width: " << Input_Image.rows << ", Channels: " << Input_Image.channels() << endl;

    Image_Inversion_CUDA(Input_Image.data, Input_Image.rows, Input_Image.rows, Input_Image.channels());

    imwrite("Inverted_Image.png", Input_Image);
    system("pause");
    return 0;
}
 

это мой cpp-файл

 #include "C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.1includecuda_runtime.h"
#include "C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.1includedevice_launch_parameters.h"
#include "C:UsersUSERsourcereposcudatry2cudatry2Inversion_CUDA.h"

__global__ void Inversion_CUDA(unsigned char* Image, int Channels);

void Image_Inversion_CUDA(unsigned char* Input_Image, int Height, int Width, int Channels){
    unsigned char* Dev_Input_Image = NULL;

    //allocate the memory in gpu
    cudaMalloc((void**)amp;Dev_Input_Image, Height * Width * Channels);

    //copy data from CPU to GPU
    cudaMemcpy(Dev_Input_Image, Input_Image, Height * Width * Channels, cudaMemcpyHostToDevice);

    dim3 Grid_Image(Width, Height);
    Inversion_CUDA << <Grid_Image, 1 >> >(Dev_Input_Image, Channels);

    //copy processed data back to cpu from gpu
    cudaMemcpy(Input_Image, Dev_Input_Image, Height * Width * Channels, cudaMemcpyDeviceToHost);

    //free gpu mempry
    cudaFree(Dev_Input_Image);
}

__global__ void Inversion_CUDA(unsigned char* Image, int Channels){
    int x = blockIdx.x;
    int y = blockIdx.y;
    int idx = (x   y * gridDim.x) * Channels;

    for (int i = 0; i < Channels; i  ){
        Image[idx   i] = 255 - Image[idx   i];
    }
}
 

это мой файл cuda

 #ifndef _Inversion_CUDA_
#define _Inversion_CUDA_
void Image_Inversion_CUDA(unsigned char* Input_Image, int Height, int Width, int Channels);
#endif
 

это файл заголовков
Пожалуйста, помогите, я в отчаянии

 Severity    Code    Description Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol "void __cdecl Image_Inversion_CUDA(unsigned char *,int,int,int)" (?Image_Inversion_CUDA@@YAXPEAEHHH@Z)   cudatry2    C:UsersUSERsourcereposcudatry2cudatry2Image_Inversion_CUDA.obj   1   
 
 Severity    Code    Description Project File    Line    Suppression State
Error   LNK1120 1 unresolved externals  cudatry2    C:UsersUSERsourcereposcudatry2x64Releasecudatry2.exe    1   
 

это ошибка, которую я получаю, и я не знаю, что происходит

Комментарии:

1. Пожалуйста, публикуйте ошибки в виде текста, а не скриншотов

Ответ №1:

В библиотеках Visual Studio отсутствовали библиотеки CUDA и includes, кроме того, я отладил ошибку cuda с помощью

 printf("error code: %sn",cudaGetErrorString(cudaGetLastError()));
 

и в свойствах проекта -> CUDA C / C -> устройство -> генерация кода мне пришлось добавить следующее:

 compute_52,sm_52;compute_35,sm_35;compute_37,sm_37;compute_50,sm_50;compute_60,sm_60;compute_61,sm_61;compute_70,sm_70;compute_75,sm_75;compute_80,sm_80

 

Ответ №2:

Проблема в том, что ваши функции Inversion_CUDA(), Image_Inversion_CUDA() заканчиваются расширением _CUDA, просто измените имена функций на все, что не заканчивается на _CUDA, и все будет в порядке.