Привет мир за использование cuda для обработки изображений

0

Я пытаюсь получить cuda для запуска ядра на своем видео в веб-камере.

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

#include "cuda.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <Windows.h>
#include "Bitmap.h"

#include "OpenCVTest.h"

#include "OpenCVTest.h"
#include <opencv2/opencv.hpp>

using namespace cv;

#define Pixel unsigned char


__global__ void TestKernel(unsigned char * img)
{
    int index = threadIdx.x + blockIdx.x * blockDim.x;
    img[index] = 100;
}

int main(void) 
{
    VideoCapture cap(0); 
    Mat input;
    Mat frame;
    Mat Output;
    cap >> frame;
    //cap >> Output;
    cvtColor(frame, Output, CV_BGR2GRAY);
    uchar *d_frame;
    size_t size = (int) (640 * 480);
    cudaMalloc((void **)&d_frame, size);

    namedWindow("Window",1);
    for(;;)
    {
        cap >> input; 
        cvtColor(input, frame, CV_BGR2GRAY);        

        cudaMemcpy(d_frame, frame.data, size, cudaMemcpyHostToDevice);

        TestKernel<<<640 * 480, 1>>>( d_frame );

        cudaMemcpy(Output.data, d_frame, size, cudaMemcpyDeviceToHost);

        imshow("Window", Output);
        if(waitKey(30) >= 0) break;
    }

    cudaFree(d_frame);

    return 0;
}

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

РЕДАКТИРОВАТЬ

Как сказал Роберт, я добавил некоторую проверку ошибок, добавив

gpuErrchk( cudaPeekAtLastError() );

После вызова ядра

Где gpuErrchk

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
   if (code != cudaSuccess) 
   {
      fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
      if (abort) exit(code);
   }
}

Изображение 174551

  • 0
    «Недопустимый аргумент» - это ошибка, которую вы получите, если попытаетесь запустить ядро с слишком большим размером сетки.
Теги:
opencv
visual-studio
cuda

1 ответ

3
Лучший ответ

640 * 480 = 307200

Если вы не скомпилировали код и не работаете на процессоре cc 3.0 или выше, это не приемлемый выбор для первого параметра конфигурации ядра:

    TestKernel<<<640 * 480, 1>>>( d_frame );

Для устройств pre-cc3.0 первый параметр (т.е. Maximum x-dimension of a grid of thread blocks) ограничен 65535 для первых 2 измерений величины dim3.

Если вы сделали правильную проверку ошибок cuda, вы узнаете, что ваше ядро не работает (и/или другие ошибки.) Вы также можете попробовать запустить свой код с помощью cuda-memcheck в качестве быстрого теста.

  • 0
    Свой Quadro K4000
  • 0
    Вы скомпилировали свой код с соответствующим переключателем архитектуры для Quadro K4000? Вы добавили правильную проверку ошибок cuda? Вы запускали свой код с помощью cuda-memcheck в качестве быстрого теста?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню