【问题标题】:Hello world for using cuda for image processing使用 cuda 进行图像处理的 Hello world
【发布时间】:2014-07-25 22:42:55
【问题描述】:

我正在尝试让 cuda 在我的网络摄像头视频上执行内核。

我希望它从我的网络摄像头中检索数据,将其发送到我的 GPU,处理内核,然后将生成的图像发送回以进行显示。

#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);
   }
}

【问题讨论】:

  • "invalid argument" 是您尝试启动网格尺寸过大的内核时出现的错误。

标签: c++ .net visual-studio opencv cuda


【解决方案1】:

640 * 480 = 307200

除非您已编译代码并在 cc 3.0 或更高版本的 GPU 上运行,否则对于内核的第一个配置参数,这是不可接受的选择:

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

对于 cc3.0 之前的设备,第一个参数(即 Maximum x-dimension of a grid of thread blocksis limited to 65535 用于 dim3 数量的前 2 个维度。

如果您执行了proper cuda error checking,您会发现您的内核没有运行(和/或其他错误)。您也可以尝试使用cuda-memcheck 运行您的代码作为快速测试。

【讨论】:

  • 您是否使用适用于 Quadro K4000 的架构开关编译了代码?您是否添加了正确的 cuda 错误检查?您是否使用 cuda-memcheck 作为快速测试来运行您的代码?
  • 在 NVIDIA 的可视化分析器中运行程序后,我收到了相同的 Ivalid 参数错误消息。
  • 如果您不针对 cc3.0 或更新的架构进行编译,您的代码就会损坏。如果你在可视化分析器下运行它,你为什么会期待一些不同的东西? Quadro K4000 是 cc3.0 GPU,因此请在编译命令行中添加 -arch=sm_30 之类的内容,然后重新开始测试。
  • 将 -arch=sm_30 添加到命令行似乎可以做到,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2015-08-09
  • 2014-05-15
  • 2014-12-09
  • 2016-08-06
  • 1970-01-01
  • 2012-03-20
相关资源
最近更新 更多