cuda入门——结合opncv和cuda编程(2)

原创 2013年12月03日 17:58:13

opencv读入图片,将图片数据传递到cuda处理

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<stdio.h>

using namespace std;
using namespace cv;


#define NUM_BLOCK  300  // Number of thread blocks  
#define NUM_THREAD  64 
   
__global__  void hello(uchar *a, uchar *b,int bins,int nthreads, int nblocks)   
{  
	int i; 
    int idx = blockIdx.x*blockDim.x+threadIdx.x;  // Sequential thread index across the blocks  
    for (i=idx; i<bins; i+=nthreads*nblocks) {  
        a[idx]+=b[idx];  
		if(a[idx]>255)
			a[idx]=255;
		if(a[idx]<0)
			a[idx]=0;
    }   
}  

int main()
{	
	IplImage* img1=cvLoadImage("test1.jpg",0);
	IplImage* img2=cvLoadImage("test2.jpg",0);
	uchar* a=(uchar*)img1->imageData; 
	uchar* b=(uchar*)img2->imageData; 
	int N=img1->height*img1->widthStep;
	uchar *ad;  
    uchar *bd;  
    const int csize = N*sizeof(uchar);  
    const int isize = N*sizeof(uchar);     
   
   
    cudaMalloc( (void**)&ad, csize );   
    cudaMalloc( (void**)&bd, isize );   
    cudaMemcpy( ad, a, csize, cudaMemcpyHostToDevice );   
    cudaMemcpy( bd, b, isize, cudaMemcpyHostToDevice );   
     
	dim3 dimGrid(NUM_BLOCK,1,1);  // Grid dimensions  
    dim3 dimBlock(NUM_THREAD,1,1);  // Block dimensions  
    hello<<<dimGrid, dimBlock>>>(ad, bd,N,NUM_THREAD, NUM_BLOCK);  
    cudaMemcpy( b, ad, csize, cudaMemcpyDeviceToHost ); 

    cudaFree( ad );  
    cudaFree( bd );  	


    cvNamedWindow("图像显示",CV_WINDOW_AUTOSIZE);
    cvShowImage("图像显示",img2);
    cvWaitKey(0);
	return 0;
 
}
参考代码:计算圆周率

#include <stdio.h>
#include<windows.h>
#include <cuda.h>

#define NBIN 1000000000 // Number of bins
#define NUM_BLOCK  300  // Number of thread blocks
#define NUM_THREAD  64  // Number of threads per block
int tid;
float pi = 0;

// Kernel that executes on the CUDA device
__global__ void cal_pi(float *sum, int nbin, float step, int nthreads, int nblocks) {
	int i;
	float x;
	int idx = blockIdx.x*blockDim.x+threadIdx.x;  // Sequential thread index across the blocks
	for (i=idx; i< nbin; i+=nthreads*nblocks) {
		x = (i+0.5)*step;
		sum[idx] += 4.0/(1.0+x*x);
	}
}



 //Main routine that executes on the host
int main(void) {
 LARGE_INTEGER frec;  
LARGE_INTEGER strt;  
LARGE_INTEGER ed;  
QueryPerformanceFrequency(&frec);  
QueryPerformanceCounter(&strt);  
	dim3 dimGrid(NUM_BLOCK,1,1);  // Grid dimensions
	dim3 dimBlock(NUM_THREAD,1,1);  // Block dimensions
	float *sumHost, *sumDev;  // Pointer to host & device arrays

	float step = 1.0/NBIN;  // Step size
	size_t size = NUM_BLOCK*NUM_THREAD*sizeof(float);  //Array memory size
	sumHost = (float *)malloc(size);  //  Allocate array on host
	cudaMalloc((void **) &sumDev, size);  // Allocate array on device
	// Initialize array in device to 0
	cudaMemset(sumDev, 0, size);
	// Do calculation on device
	cal_pi <<<dimGrid, dimBlock>>> (sumDev, NBIN, step, NUM_THREAD, NUM_BLOCK); // call CUDA kernel
	// Retrieve result from device and store it in host array
	cudaMemcpy(sumHost, sumDev, size, cudaMemcpyDeviceToHost);
	for(tid=0; tid<NUM_THREAD*NUM_BLOCK; tid++)
		pi += sumHost[tid];
	pi *= step;

	// Print results
	printf("PI = %f\n",pi);

	// Cleanup
	free(sumHost); 
	cudaFree(sumDev);	         


 QueryPerformanceCounter(&ed); 

printf("%e\n",(ed.QuadPart-strt.QuadPart)*1000/frec.QuadPart);  
	return 0;
}


相关文章推荐

dimGrid和blockDim变量

cuda中kernel的启动 //设置对应的执行配置参数,dim3类型的struct变量 dim3 dimBlock(Width,Width);//描述块的配置 dim3 dimGrid(1,1...
  • ZIV555
  • ZIV555
  • 2016年05月19日 16:43
  • 754

图像处理算法基础(一)---图像颜色空间转换

主要是一些算法基础函数,千里之行始于足下,记下这些基础函数迟早会有用武之地。 #define RGB565_R(p) ((((p) & 0xF800) >> 11) #define RGB565...

用Eclipse tomcat新建一个JSP页面(一)

步骤一: 安装jdk 步骤二:安装tomcat

GPU编程自学2 —— CUDA环境配置

深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。 二、 CUDA环境配置...
  • shuzfan
  • shuzfan
  • 2017年08月03日 09:14
  • 834

CUDA编程模型(入门)

  • 2009年09月02日 16:05
  • 1.01MB
  • 下载

GPU 编程入门到精通(一)之 CUDA 环境安装

博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程。有志同道合的小伙伴...
  • xsc_c
  • xsc_c
  • 2014年04月11日 21:14
  • 20422

CUDA编程入门

1. CUDA简介 GPU是图形处理单元(Graphic Processing Unit)的简称,最初主要用于图形渲染。自九十年代开始,GPU的发展产生了较大的变化,NVIDIA、AMD(A...

CUDA学习日志:入门例程和编程接口

上篇博文我们主要是介绍了CUDA开发环境的配置和一些学习资源。现在我们正式进入CUDA的学习。如果你还记得上篇最后有一个“Hello World”的例子,你会发现它和C程序根本没什么差。不过,从这个H...
  • Linoi
  • Linoi
  • 2014年11月23日 11:03
  • 2229

CUDA编程入门----Thrust库简介

一、简介 Thrust开源库的简介是“code at speed of light”。光速代码的实现听上去太过夸张,但是thrust在cuda硬件加速中确实有着无比强大的功能。 Thrus...

CUDA编程系列学习-从入门到放弃

本文主要从代码方面进行CUDA系列知识的学习,基础知识就不一一细讲了,毕竟很多大牛已经介绍得很详细了,,,,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cuda入门——结合opncv和cuda编程(2)
举报原因:
原因补充:

(最多只允许输入30个字)