2012-09-20 11:43:30 rabbit729 阅读数 5514
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    11872 人正在学习 去看看 姜雪伟

  本系列文章将使用GPU实现图像处理中常用的算法,此处只给出代码,关于算法原理描述有很多资料,大家可以自行查找。不足之处请大家不吝赐教,共同提高。

/********************************
*  Author: rabbit729
*  E-mail: wlq_729@163.com
*  Date:   2012-09-20
*  Description: 图像的二值化
********************************/
#include <d3dx9.h>

//-----------------------------------------------------------------------------
// Desc: 全局变量
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D                 = NULL;  //Direct3D对象
LPDIRECT3DDEVICE9       g_pd3dDevice           = NULL;  //Direct3D设备对象

LPDIRECT3DTEXTURE9      g_pTextureScreen        = NULL; //待处理图片

ID3DXEffect*            g_pEffect               = NULL;  //效果指针
//常量句柄
D3DXHANDLE              hTechScreen             = NULL;  //Effect句柄
D3DXHANDLE              hTexScreen              = NULL;  //纹理句柄
D3DXHANDLE              hViewPortWidthInv       = NULL;  //视口宽倒数句柄
D3DXHANDLE              hViewPortHeightInv      = NULL;  //视口高倒数句柄

LPDIRECT3DVERTEXBUFFER9 g_pScreenSpaceQuad      = NULL;  //背板VB

const int WIDTH  = 465;
const int HEIGHT = 669;

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)

struct Vertex
{
	Vertex(){}
	Vertex(float x, float y, float z, float w)
	{
		_x = x;   _y = y;   _z = z; _w = w;
	}

	float _x, _y, _z, _w;

	static const DWORD FVF;
};
const DWORD Vertex::FVF = D3DFVF_XYZW;


//-----------------------------------------------------------------------------
// Desc: 设置世界矩阵
//-----------------------------------------------------------------------------
VOID SetWorldMatrix()
{
	//创建并设置世界矩阵
	D3DXMATRIXA16 matWorld, matRotateX, matRotateY;
	D3DXMATRIXA16 matScale;
	D3DXMatrixIdentity(&matScale);
	matScale._11 = matScale._22 = matScale._33 = 0.5f;

	D3DXMatrixIdentity(&matWorld);
	D3DXMatrixIdentity(&matRotateX);
	D3DXMatrixIdentity(&matRotateY);
	D3DXMatrixRotationX( &matRotateX, D3DX_PI / 3.0 );
	D3DXMatrixRotationY( &matRotateY, -D3DX_PI / 8.0 );
	D3DXMatrixMultiply(&matWorld, &matRotateX, &matRotateY);

	D3DXMatrixMultiply(&matWorld, &matScale, &matWorld);
	g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
}


//-----------------------------------------------------------------------------
// Desc: 设置观察矩阵和投影矩阵
//-----------------------------------------------------------------------------
VOID SetViewAndProjMatrix()
{
	//创建并设置观察矩阵
	D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-250.0f );
	D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
	D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
	D3DXMATRIXA16 matView;
	D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
	g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

	//创建并设置投影矩阵
	D3DXMATRIXA16 matProj;
	D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f );
	g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}


//-----------------------------------------------------------------------------
// Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
	//创建Direct3D对象, 该对象用于创建Direct3D设备对象
	if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
		return E_FAIL;

	//设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
	D3DPRESENT_PARAMETERS d3dpp; 
	ZeroMemory( &d3dpp, sizeof(d3dpp) );
	d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;

	//创建Direct3D设备对象
	if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&d3dpp, &g_pd3dDevice ) ) )
	{
		return E_FAIL;
	}

	//创建Effect
	ID3DXBuffer* errBuffer = NULL;
	if (FAILED(D3DXCreateEffectFromFile(g_pd3dDevice, L"erzhihua.fx", NULL, NULL, D3DXSHADER_DEBUG | D3DXSHADER_SKIPOPTIMIZATION, NULL, &g_pEffect, &errBuffer)))
	{
		if (errBuffer)
		{
			MessageBox(0, (LPCTSTR)errBuffer->GetBufferPointer(), 0, 0);
			errBuffer->Release();
		}
		return E_FAIL;
	}

	//获取常量句柄
	hTechScreen         = g_pEffect->GetTechniqueByName("Screen");
	hTexScreen          = g_pEffect->GetParameterByName(0, "TexScreen");
	hViewPortWidthInv   = g_pEffect->GetParameterByName(0, "viewport_inv_width");
	hViewPortHeightInv  = g_pEffect->GetParameterByName(0, "viewport_inv_height");

	//设置环境光
	g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );

	//设置观察矩阵和投影矩阵
	SetViewAndProjMatrix();

	return S_OK;
}

//-----------------------------------------------------------------------------
// Desc: 创建场景图形
//-----------------------------------------------------------------------------
HRESULT InitGeometry()
{
	// 创建屏幕板
	g_pd3dDevice->CreateVertexBuffer(
		6 * sizeof(Vertex),
		D3DUSAGE_WRITEONLY,
		Vertex::FVF, 
		D3DPOOL_MANAGED,
		&g_pScreenSpaceQuad,
		0);

	Vertex* vertices;
	g_pScreenSpaceQuad->Lock(0, 0, (void**)&vertices, 0);

	vertices[0] = Vertex(-1.0f, 1.0f, 0.5f, 1.0f);
	vertices[1] = Vertex(1.0f,  1.0f, 0.5f, 1.0f);
	vertices[2] = Vertex( 1.0f, -1.0f, 0.5f, 1.0f);
	vertices[3] = Vertex(-1.0f, 1.0f, 0.5f, 1.0f);
	vertices[4] = Vertex( 1.0f, -1.0f, 0.5f, 1.0f);
	vertices[5] = Vertex( -1.0f, -1.0f, 0.5f, 1.0f);

	g_pScreenSpaceQuad->Unlock();

	//加载纹理
	HRESULT hr = D3DXCreateTextureFromFile(g_pd3dDevice, L"meinv.jpg", &g_pTextureScreen);
	if (FAILED(hr))
	{
		return E_FAIL;
	} 

	return S_OK;
}


//-----------------------------------------------------------------------------
// Desc: 释放创建的对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
	if (g_pScreenSpaceQuad != NULL)
	{
		g_pScreenSpaceQuad->Release();
	}

	if (g_pTextureScreen != NULL)
	{
		g_pTextureScreen->Release();
	}

	if (g_pEffect != NULL)
	{
		g_pEffect->Release();
	}

	//释放Direct3D设备对象
	if( g_pd3dDevice != NULL )
		g_pd3dDevice->Release();

	//释放Direct3D对象
	if( g_pD3D != NULL )
		g_pD3D->Release();
}

VOID RenderScreen()
{
	//将RenderTarget作为纹理
	g_pEffect->SetTexture(hTexScreen, g_pTextureScreen);

	float fWidthInv = 1.0f / WIDTH;
	float fHeightInv = 1.0f / HEIGHT;
	g_pEffect->SetFloat(hViewPortWidthInv, fWidthInv);
	g_pEffect->SetFloat(hViewPortHeightInv, fHeightInv);

	g_pd3dDevice->SetStreamSource(0, g_pScreenSpaceQuad, 0, sizeof(Vertex));
	g_pd3dDevice->SetFVF(Vertex::FVF);

	// 设置要使用的Technique
	g_pEffect->SetTechnique(hTechScreen);

	UINT numPasses = 0;
	g_pEffect->Begin(&numPasses, 0);

	for (int i = 0; i < numPasses; i++)
	{
		g_pEffect->BeginPass(i);

		g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

		g_pEffect->EndPass();
	}
	g_pEffect->End();
}

//-----------------------------------------------------------------------------
// Desc: 渲染场景
//-----------------------------------------------------------------------------
VOID Render()
{    
	// 获取backbuffer
	LPDIRECT3DSURFACE9 pBackbuffer;
	g_pd3dDevice->GetRenderTarget(0, &pBackbuffer);

	//开始渲染场景
	if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
	{
		//设回backbuffer
		g_pd3dDevice->SetRenderTarget(0, pBackbuffer);
		RenderScreen();

		//场景渲染结束
		g_pd3dDevice->EndScene();
	}

	//在屏幕上显示场景
	g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}


//-----------------------------------------------------------------------------
// Desc: 窗口过程, 处理消息
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	switch( msg )
	{
	case WM_DESTROY:
		Cleanup();
		PostQuitMessage( 0 );
		return 0;
	}

	return DefWindowProc( hWnd, msg, wParam, lParam );
}


//-----------------------------------------------------------------------------
// Desc: 入口函数
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
	//注册窗口类
	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
		GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
		L"ClassName", NULL };
	RegisterClassEx( &wc );

	//创建窗口
	HWND hWnd = CreateWindow( L"ClassName", L"图像二值化", 
		WS_OVERLAPPEDWINDOW, 200, 100, WIDTH, HEIGHT,
		GetDesktopWindow(), NULL, wc.hInstance, NULL );

	//初始化Direct3D
	if( SUCCEEDED( InitD3D( hWnd ) ) )
	{ 
		//创建场景图形
		if( SUCCEEDED( InitGeometry() ) )
		{
			//显示窗口
			ShowWindow( hWnd, SW_SHOWDEFAULT );
			UpdateWindow( hWnd );

			//进入消息循环
			MSG msg; 
			ZeroMemory( &msg, sizeof(msg) );
			while( msg.message!=WM_QUIT )
			{
				if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
				{
					TranslateMessage( &msg );
					DispatchMessage( &msg );
				}
				else
				{
					Render();  //渲染场景
				}
			}
		}
	}

	UnregisterClass( L"ClassName", wc.hInstance );
	return 0;
}


Effect代码如下:

/********************************
*  Author: rabbit729
*  E-mail: wlq_729@163.com
*  Date:   2011-09-20
********************************/

//------------------------------
//  顶点着色器
//------------------------------

float viewport_inv_width;
float viewport_inv_height;
struct VS_OUTPUTSCREEN {
   float4 Pos: POSITION;
   float2 texCoord: TEXCOORD0;
};

VS_OUTPUTSCREEN vs_mainPassScreen(float4 Pos: POSITION){
   VS_OUTPUTSCREEN Out;

   Out.Pos = float4(Pos.xy, 0, 1);

   Out.texCoord.x = 0.5 * (1 + Pos.x - viewport_inv_width);
   Out.texCoord.y = 0.5 * (1 - Pos.y - viewport_inv_height);

   return Out;
}

//------------------------------
//  像素着色器
//------------------------------
Texture2D TexScreen;

sampler2D TexMapScreen {
    Texture = <TexScreen>;
};

float4 ps_mainPassScreen(float2 texCoord: TEXCOORD0) : COLOR 
{
   float4 col = tex2D(TexMapScreen,  texCoord);
   float Intensity;

   // 灰度化
   // I = 0.299*R + 0.587*G + 0.184*B
   Intensity = 0.299*col.r + 0.587*col.g + 0.184*col.r;
   
   // 阈值为0.5,关于怎么选取阈值有好多方法,大家可以自行查阅
   if(Intensity > 0.5)
      Intensity = 0.5f;
   else
      Intensity = 0.1f;

   return float4(Intensity.xxx,col.a);
}

technique Screen
{
   pass P0
   {
      VertexShader = compile vs_3_0 vs_mainPassScreen();
      PixelShader  = compile ps_3_0 ps_mainPassScreen();
   }
}


 结果:

原始图片:

二值化后结果:

2014-07-27 20:47:02 Evankaka 阅读数 6641
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    11872 人正在学习 去看看 姜雪伟

     现代GPU提供了顶点处理器和片段处理器两个可编程并行处理部件。在利用GPU执行图像处理等通用计算任务时,要做的主要工作是把待求解的任务映射到GPU支持的图形绘制流水线上。通常的方法是把计算任务的输入数据用顶点的位置、颜色、法向量等属性或者纹理等图形绘制要素来表达,而相应的处理算法则被分解为一系列的执行步骤,并改写为GPU的顶点处理程序或片段处理程序,然后,调用3D API执行图形绘制操作,调用片段程序进行处理;最后,保存在帧缓存中的绘制结果就是算法的输出数据。虽然数字图像处理算法多种多样,具体实现过程也很不相同,但是在利用GPU进行并行化处理时,有一些共性的关键技术问题需要解决,如:数据的加载,计算结果的反馈、保存等。下面对这些共性的问题进行分析,并提出相应的解决思路。

    1.数据加载
    在GPU的流式编程模型中,所有的数据都必须以“流”的形式进行加载处理,并通过抽象的3D API进行访问。在利用GPU进行图像处理时,最直接有效的数据加载方法是把待处理的图像打包为纹理,在绘制四边形时进行加载、处理。同时为了保证GPU上片段程序能够逐像素的对纹理图像进行处理,必须将投影变换设置为正交投影,视点变换的视区与纹理大小相同,使得光栅化后的每个片段(fragment)和每个纹理单元(texel)一一对应。对于图像处理算法中的其他参数,如果数据量很小,则可以直接通过接口函数进行设置;如果参数比较多,也应该将其打包为纹理的形式传输给GPU。在打包的过程中应充分利用纹理图像所具有的R、G、B、A四个通道。
    2.计算结果的反馈、保存
应用程序是通过调用3D API绘制带纹理的四边形,激活GPU上的片段程序进行图像处理的,而GPU片段着色器的直接渲染输出是一个帧缓冲区,它对应着计算机屏幕上的一个窗口,传统上用来容纳要显示到屏幕的像素,但是在GPU流式计算中可以用来保存计算结果。虽然CPU可以通过3D API直接读写这个帧缓冲区,将渲染处理的结果从帧缓存中复制到系统内存进行保存,但是帧缓存的大小受窗口大小限制,而且由于AGP总线的带宽限制(2.1GB/s),从显存到系统

镜像变换 GPU 渲染主要包括以下几个步骤:

1) 设置 1 个输入纹理;
2) 对输入纹理进行纹理采样;
3) 设置变换矩阵;
4) 在顶点着色器中,将输入顶点与变换矩阵相乘;

5) 输出图像数据;


2013-08-14 11:22:47 zhang0311 阅读数 10544
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    11872 人正在学习 去看看 姜雪伟

1                什么是GPU高性能计算

      近年来,以NVIDIA Tesla为代表的异构芯片(协处理器)逐渐被引入到通用计算领域中。最初的图形处理(Graphic Processing Unit, GPU)就是用来处理大规模的并行计算,并且GPU的并行处理能力在不断的上升。GPU将更多的晶体管用于执行单元,而非像CPU那样用作复杂的数据cache和指令控制。由于GPU具有超强的浮点计算能力,除了在传统领域(图形显示,多用于游戏)的应用以外,GPU越来越多地应用在科学计算领域上,并且逐渐进入高性能计算的主流。

       CUDA(Compute Unified Device Architecture,统一计算设备架构)是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的高性能计算问题。CUDA编程是在C语言上的基础上对C语言的扩展,不再需要借助于图形学APICUDA开发人员只需要在C语言的基础上从CPU过度到GPU上,CUDA提供了简单、容易的GPU开发工具,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA编程采用了异构体系结构的模式,CPU作为主机,GPU作为CPU的协处理器(或称设备),CPUGPU协同工作,CPU负责逻辑性强的事务处理和串行计算,GPU负责高度并行化的计算任务,CPUGPU共同完成加速任务。

     CUDA编程语言的推出,使得在GPU平台上的高性能计算应用软件越来越多。目前,CUDA在石油勘测、流体动力学模拟、天文计算、分子动力学仿真、生物计算、图像处理、音频视频编解码、医疗成像、金融、数据库等领域得到广泛的应用,在很多应用中获得2-3个数量级的加速比,极大地提高了性能。

 

     GPU已广泛应用在图像增强处理、图像目标搜索、公安行业、国防安全、平安城市、交通系统、救灾、卫星成像、信号处理、人脸识别、指纹识别、多路高清直播、智能视频监控等领域中。在这些领域,利用GPU可以达到实时性计算,相对CPU平台加速数十倍甚至数百倍,CUDA计算在图像处理领域中的成功案例如下图:

2                GPU高性能计算特点

     目前,高端的Nvidia GPU包含上千个核,双精度峰值性能超过1Tflops,单精度性能超过3Tflops,性价比远超过CPUNVIDIA GPUTeslaGeForce两个系列,Tesla为服务器上专用,内存空间较大,运行稳定,但价格较高,GeForce系列显卡性能达到Tesla的性能,然而成本很低,中端系列的GeForce显卡只需要一千多元配置在PC上即可获得数十倍的性能。

     目前,很多应用运行在PC机器上,然后PC的性能有限,尤其随着处理的数据规模的增大,PC已远不能满足性能的需求,当采用CPU服务器解决时,成本将提高5-10倍,不利于成本的控制。然后,Nvidia提供了PC版本的GeForce系列GPUGeForce系列GPU价格在数百元到上万元之前,我们可以采用PC+ GeForce GPU的配置方案,性能同样可以获得原PC的数十倍,然而,成本仅增加10%-50%PC+GPU的优化方案将成为一些应用软件的重要配置方案。


          Emailzhang03_11@163.com

          QQ331526010

 

 

2019-11-08 09:54:34 weixin_45851230 阅读数 37
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    11872 人正在学习 去看看 姜雪伟
                                        深度学习GPU+FPGA图像处理卡

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
M/D-CAP3U是天津雷航光电科技有限公司推出的一款复合加速计算平台,由Xilinx的28nm制程的FPGA — XC7K325T-3FFG900I和NVidia的16nm制程的GPU — TX2互联构成。
产品细节
FPGA的前端接口
支持CameraLink Base输入1路
支持SD-SDI / HD-SDI / 3G-SDI输入1路
支持同轴高清STP视频输入1路
支持D1标清模拟视频输入4路
支持CameraLink Base输出1路
支持DVI / HDMI输出1路
支持同轴高清STP视频输出1路
TX2 GPU扩展出的接口
10 / 100 / 1000三速自适应以太网
HDMI输出(micro-HDMI连接器)
USB3.0 / USB2.0输出
系统存储接口
支持SATA硬盘(mSATA连接器)
支持NVME-SSD硬盘(M.2 M Key连接器)
FPGA性能指标及功能描述
板载1GByte DDR3-1600内存(FPGA挂接的DDR3)
强大的Kintex-7 FPGA专注于浮点高密运算 / 算法预处理 / 算法加速 / 前端接口管理等功能
TX2-FPGA的PCIE带宽是800MB/s ~ 1.2GB/s
存储及使用环境
存储温度 :-55℃~125℃
工作温度 :-45℃~80℃
工作时相对湿度 :20%~80%
震动冲击 :±35g
可靠性 :MTBF ≥ 5000h
维修性 :MTTR ≤ 0.5h
供电电压 :+ 12V
整机功耗 :≤ 30W
尺寸 :100*160MM

提供的软件
FPGA固件
PCIE信道管理及收发引擎,视频前端收发引擎,NVME读写引擎
TX2侧的Linux驱动
负责将各个视频输入输出节点映射为Linux系统下标准的V4L2设备,所有的视频数据都是经由PCIE链路由FPGA推送至TX2的DDR4内存,后FPGA中断通知TX2取视频数据
TX2侧的V4L2视频捕获Demo
演示如何通过V4L2驱动抓取前端视频
经典的算法Demo
在线学习型目标跟踪(可提供源码,作为您的开发起点)
前沿的算法Demo
Yolo—基于深度学习的多目标识别框架(可提供源码,作为您的开发起点)

FPGA固件的前端逻辑框图
在这里插入图片描述

2012-11-25 12:05:48 zhang0311 阅读数 9514
  • 3D游戏引擎之GPU渲染(DX篇)

    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染。

    11872 人正在学习 去看看 姜雪伟

        近年来,以NVIDIATesla为代表的异构芯片(协处理器)逐渐被引入到通用计算领域中。最初的图形处理(GraphicProcessing Unit, GPU)就是用来处理大规模的并行计算,并且GPU的并行处理能力在不断的上升。GPU将更多的晶体管用于执行单元,而非像CPU那样用作复杂的数据cache和指令控制。由于GPU具有超强的浮点计算能力,除了在传统领域(图形显示,多用于游戏)的应用以外,GPU越来越多地应用在科学计算领域上,并且逐渐进入高性能计算的主流。

        CUDA(ComputeUnified Device Architecture,统一计算设备架构) 是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的高性能计算问题。CUDA编程是在C语言上的基础上对C语言的扩展,不再需要借助于图形学API,CUDA开发人员只需要在C语言的基础上从CPU过度到GPU上,CUDA提供了简单、容易的GPU开发工具,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA编程采用了异构体系结构的模式,CPU作为主机,GPU作为CPU的协处理器(或称设备),CPU与GPU协同工作,CPU负责逻辑性强的事务处理和串行计算,GPU负责高度并行化的计算任务,CPU与GPU共同完成加速任务。

       CUDA编程语言的推出,使得在GPU平台上的高性能计算应用软件越来越多。目前,CUDA在石油勘测、流体动力学模拟、天文计算、分子动力学仿真、生物计算、图像处理、音频视频编解码、医疗成像、金融、数据库等领域得到广泛的应用,在很多应用中获得2-3个数量级的加速比,极大地提高了性能。

        目前,很多图像处理中,如实时人物抠像、图像识别、图像检索等,对图像的要求越来越高,如720P、1080P图像的处理,在CPU平台上已无法实现这些高清图像的实时处理,严重滞后于应用的需求,而采用GPU可以相对CPU提高数十倍的性能,快速实现高清图像的实时处理,给图像处理带来了新的方法。

        采用CPU+GPU架构可以获取以下的好处:

1)速度快,采用GPU可以获得CPU的数十倍数百倍的性能,可以实时处理高清图像;

2)成本低,在普通PC机器上插上一块1000多元的Geforce GPU卡即可获得数万元、数十万元高端服务器的性能;

3)减少CPU利用率,提高系统的稳定性。

本人在CUDA方面有丰富的项目经验,并且做过图像处理方面的CUDA加速,完成过图像缩放、旋转、抠图、匹配等算法的CUDA加速,性能加速数十倍,满足了高清图像的实时处理。

有这方面需求的可以QQ(331526010)或Email(zhang03_11@163.com)联系。

GPU

阅读数 1240

没有更多推荐了,返回首页