DirectCompute使用GPU滤波

Directx11 HelloWorld之DirectCompute   前些天想根据DX11的SDk自己写一个最简单的Direct Compute,中间又病倒了,耽搁了这些天昨晚才调好,鉴于网上太少dx11的学习资料了,记录下。  首先要说的是我的改写版本主要是为了代码上的简明,去掉了很多硬件检测,以便迅速明白dx11的Direct Compute的架构,所以在很多人的机器上怕一时还运行不了,这个可以先明白基本架构后再进行向下兼容。  首先说下Directx11的存储读写模型。在Dx11的硬件中主要用buffer存储数据,device来进行计算,shader resourc 阅读详情

DirectCompute使用GPU滤波

前面已经写了第一个OpenCL的程序《OpenCL使用GPU滤波》,了解了GPU的编程。对于使用异构计算,除了OpenCL,还有微软的DirectCompute,因此,结合前文,写一个使用DirectCompute的使用GPU滤波的程序。第一个DirectCompute程序。

话不多说,和《OpenCL使用GPU滤波》一样,步骤都差不多。

第一步,下载DX11,使用下面的地址或者搜索“DXSDK_JUN10”http://www.filestube.com/8yGinHs9h2WV6SJLdOtn45/DXSDK-Jun10.html 

下载完后安装。安装就不介绍了。

第二步, VS2008设置

工具->选项,设置包含文件路径


设置库文件路径


第三步,开始编程。

为了实用和可重用,做成一个C++类。这个类必须包含3个函数,InitDirectCompute初始化, Uninit释放, Filter_GPU滤波,Filter_GPU可能会反复调用。

首先是初始化DirectCompute。初始化很复杂,不过基本是照着做就行了。

//初始化DirectCompute 。iSrDataLen数据个数,iFilterLen滤波阶数

BOOL CDX_Filter::InitDirectCompute(INint iSrcDataLen,IN int iFilterLen)

{//初始化时需要建缓冲,因此需要知道缓冲长度

   if(iSrcDataLen<=0 || iFilterLen <=0)

   {

      return FALSE;

   }

   if(m_bInitDirectCompute)

   {

      return FALSE;

   }

   m_iFilterLen[0] = iFilterLen;

   m_iSrcBufferLen  =iSrcDataLen;

   m_pSrcBuffer = newfloat[iFilterLen+ iSrcDataLen];

 

#if defined(DEBUG)||defined(_DEBUG)

   _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);

#endif

 

   m_pDevice = NULL;

   m_pContext = NULL;

 

   HRESULT hr = S_OK;

//Create Device

   UINT uCreationFlags= D3D11_CREATE_DEVICE_SINGLETHREADED;

#if defined(DEBUG) || defined(_DEBUG)

   uCreationFlags |= D3D11_CREATE_DEVICE_DEBUG;

#endif

   D3D_FEATURE_LEVEL flOut;

   static const D3D_FEATURE_LEVEL flvl[]= { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0};

 

   typedef HRESULT (WINAPI * LPD3D11CREATEDEVICE)(IDXGIAdapter*, D3D_DRIVER_TYPE,HMODULE, UINT32,CONST D3D_FEATURE_LEVEL*,UINT, UINT32,ID3D11Device**, D3D_FEATURE_LEVEL*,ID3D11DeviceContext** );

   static LPD3D11CREATEDEVICE  s_DynamicD3D11CreateDevice= NULL;

 

   if ( s_DynamicD3D11CreateDevice== NULL )

   {//动态加载D3D11.dll          

      HMODULE hModD3D11= LoadLibrary( "d3d11.dll");

 

      s_DynamicD3D11CreateDevice = ( LPD3D11CREATEDEVICE )GetProcAddress(hModD3D11, "D3D11CreateDevice");          

   }

 

   s_DynamicD3D11CreateDevice( NULL, D3D_DRIVER_TYPE_HARDWARE,NULL, uCreationFlags,flvl, sizeof(flvl) / sizeof(D3D_FEATURE_LEVEL),

      D3D11_SDK_VERSION, &m_pDevice,&flOut, &m_pContext);

 

//Create ComputeShader

 

   DWORD dwShaderFlags= D3DCOMPILE_ENABLE_STRICTNESS;

#if defined( DEBUG ) || defined(_DEBUG )

   // Set the D3DCOMPILE_DEBUG flag to embed debug informationin the shaders.

   // Setting this flag improves the shader debuggingexperience, but still allows

   // the shaders to be optimized and to run exactly the waythey will run in

   // the release configuration of this program.

   dwShaderFlags |= D3DCOMPILE_DEBUG;

#endif

 

   const D3D_SHADER_MACROdefines[] =

   {

      "USE_STRUCTURED_BUFFERS", "1",

      NULL, NULL

   };

 

   // We generally prefer to use the higher CS shader profilewhen possible as CS 5.0 is better performance on 11-class hardware

   LPCSTR pProfile=  "cs_4_0"; //此处我的机器使用CS 5.0编译通不过,我装的是DX11,可能是显卡有点老了,Geforce9600

如果改成cs_5_0能编译通过最好。

   ID3DBlob* pErrorBlob= NULL;

   ID3DBlob* pBlob= NULL;

//从文件创建shader,Filter.hlsl文件名,Filter_GPU_Single Shader中的函数

   hr = D3DX11CompileFromFile("Filter.hlsl", defines, NULL, "Filter_GPU_Single", pProfile,

      dwShaderFlags, NULL,NULL, &pBlob,&pErrorBlob, NULL);

   if ( FAILED(hr) )

   {//Shader是在程序运行时编译的。如果编译通不过,在此处输出编译错误

      if ( pErrorBlob )

        OutputDebugStringA( (char*)pErrorBlob->GetBufferPointer());

 

      SAFE_RELEASE( pErrorBlob);

      SAFE_RELEASE( pBlob);   

 

      return FALSE;

   }   

 

   hr = m_pDevice->CreateComputeShader( pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL,&m_pCS );

 

   SAFE_RELEASE( pErrorBlob);

   SAFE_RELEASE( pBlob);

开始建立所需要的缓冲。

   //为CPU中的数组创建GPU中相应Buffer

   if(FAILED(CreateStructureBuffer(m_pDevice,sizeof(float),iSrcDataLen + iFilterLen,(void*)m_pSrcBuffer,&m_pBuffer0)))

   {//源数据缓冲

      TRACE("创建buffer0失败\n");

      return FALSE;

   }

 

   if(FAILED(CreateStructureBuffer(m_pDevice,sizeof(float),iFilterLen,(void*)m_pFilterBuffer,&m_pBuffer1)))

   {//滤波系数缓冲

      TRACE("创建buffer1失败\n");

      return FALSE;

   }

 

   if(FAILED(CreateStructureBuffer(m_pDevice,sizeof(int),1,(void*)m_iFilterLen,&m_pBuffer2)))

   {//滤波长度缓冲

      TRACE("创建buffer2失败\n");

      return FALSE;

   }

 

   if(FAILED(CreateStructureBuffer(m_pDevice,sizeof(float),iSrcDataLen,NULL,&m_pBufferResult)))

   {//输出缓冲

      TRACE("创建bufferOut失败\n");

      return FALSE;

   }

 

   //为buffer创建相应的resource view,以便access buffer。

   if(FAILED(CreateBufferSRV(m_pDevice,m_pBuffer0,&m_pBuf0SRV)))

   {

      TRACE("创建buffer0 SRV 失败\n");

      return FALSE;

   }

 

   if(FAILED(CreateBufferSRV(m_pDevice,m_pBuffer1,&m_pBuf1SRV)))

   {

      TRACE("创建buffer1 SRV 失败\n");

      return FALSE;

   }

   if(FAILED(CreateBufferSRV(m_pDevice,m_pBuffer2,&m_pBuf2SRV)))

   {

      TRACE("创建buffer2 SRV 失败\n");

      return FALSE;

   }

   if(FAILED(CreateBufferUAV(m_pDevice,m_pBufferResult,&m_pBufResultUAV)))

   {

      TRACE("创建bufferOut Unordered Access View失败\n");

      return FALSE;

   }

 

初始化完毕

   m_bInitDirectCompute = TRUE;

   return TRUE;

}

析构就不用说了。

下面开始写滤波函数

//用GPU滤波,pBufferIn需要滤波的数据,pBuferOut滤波后的数据

BOOL CDX_Filter::Filter_GPU(float *pBufferIn,float *pBuferOut)

{

   if(!m_bInitFilter|| !m_bInitDirectCompute)

   {

      return FALSE;

   }

   memcpy(m_pSrcBuffer,m_pDataSave + 1,(m_iFilterLen[0]-1) * sizeof(float));//把上一次的数据尾的数据拷到源数据缓冲头

   memcpy(m_pSrcBuffer+ m_iFilterLen[0] -1,pBufferIn,m_iSrcBufferLen * sizeof(float));//拷贝源数据

   memcpy(m_pDataSave,pBufferIn + m_iSrcBufferLen - m_iFilterLen[0],m_iFilterLen[0]* sizeof(float));//把本次的数据尾的数据暂存,以便下次使用

 

   m_pContext->UpdateSubresource(m_pBuffer0,0,NULL,m_pSrcBuffer,0,0); // 更新缓冲的数据

 

   ID3D11ShaderResourceView* shaderResourceViews[3]={m_pBuf0SRV,m_pBuf1SRV,m_pBuf2SRV};

 

   m_pContext->CSSetShader(m_pCS,NULL,0); //设置Shader

   m_pContext->CSSetShaderResources(0,3,shaderResourceViews); //设置缓冲数据

   m_pContext->CSSetUnorderedAccessViews(0,1,&m_pBufResultUAV,NULL);//设置UAV

   m_pContext->Dispatch(m_iSrcBufferLen,1,1);//执行(m_iSrcBufferLen最大不能超过65535)

 

 

   //清空Shader和各个ShaderView以及以及一些Constant Buffer

   m_pContext->CSSetShader(NULL,NULL,0);

   ID3D11UnorderedAccessView* ppUAViewNULL[1]={NULL};

   m_pContext->CSSetUnorderedAccessViews(0,1,ppUAViewNULL,NULL);

   ID3D11ShaderResourceView* ppSRVNULL[2]={NULL,NULL};

   m_pContext->CSSetShaderResources(0,2,ppSRVNULL);

   ID3D11Buffer* ppCBNULL[1]={NULL};

   m_pContext->CSSetConstantBuffers(0,1,ppCBNULL);

 

   //获得结果数据  

   ID3D11Buffer* debugBuf=NULL;

   D3D11_BUFFER_DESC desc;

   ZeroMemory(&desc,sizeof(desc));

   m_pBufferResult->GetDesc(&desc);

   desc.CPUAccessFlags=D3D11_CPU_ACCESS_READ;

   desc.Usage=D3D11_USAGE_STAGING;

   desc.BindFlags=0;

   desc.MiscFlags=0;

   if(SUCCEEDED(m_pDevice->CreateBuffer(&desc,NULL,&debugBuf)))

   {

      m_pContext->CopyResource(debugBuf,m_pBufferResult);

   }

 

   D3D11_MAPPED_SUBRESOURCE MappedResource;

   m_pContext->Map(debugBuf,0,D3D11_MAP_READ,0,&MappedResource);

   memcpy(pBuferOut,MappedResource.pData,m_iSrcBufferLen * sizeof(float));

   m_pContext->Unmap(debugBuf,0);

   SAFE_RELEASE(debugBuf);

   return TRUE;

}

Shader文件中的函数

StructuredBuffer<float> Buffer0 : register(t0);

StructuredBuffer<float> Buffer1 : register(t1);

StructuredBuffer<int> Buffer2 : register(t2);

RWStructuredBuffer<float> BufferOut : register(u0);

 

[numthreads(1, 1, 1)]

void Filter_GPU_Single(uint3 DTid : SV_DispatchThreadID )

{

   int i=0;

   float fSum = 0.0;

   for(i=0;i< Buffer2[0];i++)

   {

      fSum += Buffer0[DTid.x + i] *Buffer1[i];

    }

    BufferOut[DTid.x] = fSum;

 

}

为了验证用GPU计算的结果是否正确,还需要写CPU计算的程序,以便验证其正确性。CPU计算此处就不贴代码了,完整代码请到http://download.youkuaiyun.com/detail/iddialog/4683767下载。

 

以上程序在win7 、DX11和  VC++ 2008 + SP1 编译通过。能够正常运行。运行结果GPU和CPU运算结果是一致的。由于每次计算后,m_pDataSave的内容发生变化,输出缓冲的前面一段数据可能会不一样。如果要测试GPU和CPU两种方式的结果是否一样,需要每次在滤波前把m_pDataSave的内容设成一样。

如果VS2008没有SP1,需要修改stdafx.h文件

删除下面这行

#include <afxcontrolbars.h> // 功能区和控件条的MFC支持

添加

#ifdef CWinAppEx

#undef CWinAppEx

#endif

#define  CWinAppEx CWinApp

 

结尾:

由于第一次写DirectCompute程序,错误在所难免。只是对前文《OpenCL使用GPU滤波》的另一个实现,多通道滤波函数就没有写了。学习DirectCompute编程而已。还是要提一下C++AMP,这个是比较新的技术,集成在VS2012中,我还没有安装VS2012。等有空了安装了,再来写C++AMP的程序。还是那句话“什么时候我们的程序由CPU和GPU自动调节运行就好了,对用户和程序员均不透明,就像双核或者多核CPU一样,我们根本就不用关心程序或者说某个线程在哪个核上运行!”。

Kettle全版本安装包及驱动合集:免费网盘资源一站式获取(持续更新) 本文提供Kettle全版本安装包及常用数据库驱动的一站式免费网盘资源合集,并持续更新。文章详细对比了Kettle 8.2、9.2、9.3版本的优缺点,推荐9.2为平衡稳定与功能的“甜点”版本,并附上手把手的下载、安装与驱动配置实战指南,帮助用户高效获取资源并快速上手。 阅读详情

相关推荐

Windows中Kettle常见报错及解决方法总结

Kettle在Windows环境下广泛使用,但可能会因为系统配置、权限问题或作业配置不当而遇到各种错误。本文总结了一些常见的错误及解决方法,希望能帮助用户快速排查和解决问题。

m0_70691645的博客 6694

CUDA的代替选择

摘抄自CUDA并行程序设计 GPU编程指南:1.11。

qq_33598781的博客 3577

kettle系列(1)kettle连接mysql

kettle连接配置MySQL报错

ymxjj的博客 1442

DirectCompute & DirectX 11 计算着色器编程简介(翻译)

译者注:DirectX一直是Windows上图形和游戏开发的核心技术。DirectX提供了一种在显卡上运行的程序——着色器(Shader)。在DirectX 11之前,着色器是与具体的渲染步骤绑定的,例如像素着色器,顶点着色器等等。而从DirectX11开始,DirectX增加了一种计算着色器(Compute Shader),它是专门为与图形无关的通用计算设计的。因此DirectX就变成了一个通用...

weixin_34051201的博客 487

Kettle 连接Mysql数据库报错

新安装了Kettle 6.1,安装文件为 pdi-ce-6.1.0.1-196.zip 。 连接Mysql数据,输入IP地址  数据库名称 用户名 密码,报错!如下: 错误信息: 错误连接数据库 [tcc] : org.pentaho.di.core.exception.KettleDatabaseException:  Error occurred while trying to c

logic_TiBu的博客 4062

使用DirectCompute 实现数字滤波

使用CPU + GPU的异构模式,实现单通道数字滤波(FIR).其实现采用CPU实现和GPU实现,可以对比两种方法的结果。主要采用了DirectCompute框架,在VS2008 + DX11 + Win7下编译通过,显卡GForce 9600. VC完整工程,独立的C++类,全源码。可以作为DirectCompute的入门资料。如果不能正常使用,请参看《ReadMe.doc》.

DirectCompute开启Windows7 GPU运算大门

本文导航第1页:什么是 DirectX Compute第2页:Windows 7里最重要的API第3页:GPU运算工作原理解析第4页:Demo1. 高清播放更流畅,CPU占用低第5页:Demo2. 视频转码更简单,更快速第6页:Demo3. 手机视频变清晰,手抖也不怕第7页:Demo4. 高清视频编辑,速度快5倍第8页:Demo5. 生动有趣的视频编辑第9页:Demo6. 标清变高清,分辨率也能升

Augusdi的专栏 4315

DirectCompute

NULL 博文链接:https://lengbingteng.iteye.com/blog/1771145

双剑合璧:CPU+GPU异构计算完全解析

作者:小熊在线-宁道奇 日期:2011年06月20日 . http://www.beareyes.com.cn/2/lib/201106/20/20110620416_0.htm 并行计算:让处理的速度变得更快 相对于串行计算,并行计算可以划分成时间并行和空间并行。时间并行即流水线技术,空间并行使用多个处理器...

weixin_30855099的博客 881

c# direct x 播放视频

这是一个用c#编写的用direct x播放视频的代码,可能有些小错误,自己搞定吧

Win10 环境下 ISE14.7 iMPACT 闪退的 DLL 修复方案 - FPGA 开发实战

本文详细介绍了在Win10系统下解决ISE14.7 iMPACT工具闪退问题的DLL修复方案,特别针对FPGA开发中常见的兼容性问题。通过替换关键DLL文件,有效解决了iMPACT在生成PROM文件时的崩溃问题,并提供了详细的步骤说明和注意事项,帮助开发者提升工作效率。

weixin_29197051的博客 210

[大数据技术]Kettle初次连接MySQL数据库 报错问题 错误连接数据库 Error occured while trying to connect to the database Excep...

报错内容如下: 1 错误连接数据库 [foodmartconn] : org.pentaho.di.core.exception.KettleDatabaseException: 2 Error occured while trying to connect to the database 3 4 Exception while loading class 5 org....

weixin_43847567的博客 962

博客系统 - 系统简介与首页设计

用Bootstrap实现手机端的博客导航栏效果。

m0_53450409的博客 1237

使用etl工具kettle的日常踩坑梳理之一、从mysql中导出数据

3、我现在想把mysql中某一张表的数据导出来,就先点击输入下面的表输入,输出就是用什么格式的文件存储,比如我想用xlsx存储就选择这个excel。提醒一下,如果数据库连接那里报错就把mysql的jar包导入到kettle的lib目录下去,我这里倒了两个版本的,因为我要连接多个版本的MySQL。7然后按住shift键别动,用鼠标把两个拉起来,然后点击那个三角形启动,然后会弹出导出的过程。6、然后点击导出的excel进行简单的配置,比如保存的目录文件名称等(点击浏览可以设置)。

大马猴5的博客 579

在树莓派5(8G版)上运行Ollama + LLM

直接上结论,Ollama在树莓派上能安装,且本身运行起来毫无压力,但具体到大语言模型,Deepseek似乎不总是最佳选择。

ki1381的专栏 1651

基于Simulink实现电动汽车制动能量回收系统的仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车制动能量回收系统的仿真研究。该系统能够全面评估制动能量回收系统的性能,验证控制策略的有效性,并通过优化设计提高能量回收效率和制动安全性。引入智能预测:结合人工智能技术,实现更智能的能量回收控制策略。扩展功能:增加对多种车型和制动场景的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 336

Kettle连接MySQL报错:错误连接数据库 [mysql] : org.pentaho.di.core.exception.KettleDatabaseException的解决办法

在Windows系统里面安装Kettle后打算连接MySQL的时候突然报错: 错误连接数据库 [mysql] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the database Driver class ‘org.gjt.mm.mysql.Dr...

小白的编码屋 3万+

34、木材在家具制造中的应用

本文详细探讨了木材在家具制造中的应用,从木材的选择、加工技术到设计创新和表面处理等方面进行了全面解析,并结合实际案例分析木材家具的市场趋势与未来发展。文章强调了木材家具在功能性、智能化和环保性方面的潜力,展示了其在现代家居生活中的重要地位。

flink9streamer的博客 242

kettle安装、MySQL数据库连接、报错处理

跟kettle斗智斗勇的一下午,下面是我踩过的一些坑,希望对大家在安装配置kettle时有所帮助,首先放一张我成功的截图:

weixin_66170039的博客 4661

在轻量化与精度之间取得平衡:YOLOv8 + GhostNet 的设计与实验分析

摘要: GhostNet系列(GhostNet、GhostNetv2、GhostNeXt)通过“幽灵特征图”技术,以极低计算量生成丰富特征,为YOLOv8提供轻量化改造方案。该技术能在减少参数量与计算量的同时保持或提升检测精度,适用于边缘设备部署。实现时需替换YOLOv8的Backbone为GhostNet模块,并通过消融实验验证其有效性。实验数据表明,改造后的模型在参数量降低30%的同时,推理速度提升28.6%,mAP@0.5最高提升1.9个百分点,平衡了轻量化与精度,为毕设提供技术创新性与工程落地性的双

m0_64661770的博客 194

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 268

Kettle连接MySQL报错的解决方法

使用Kettle报错的解决方法 1.当你在navicat上面测试数据库连接的时候可以看到数据库连接成功。而在Kettle上面连接同样的库的时候报出一大段错误出来,这时候是不是感觉有点懵逼了。 错误内容如下: 错误连接数据库 [test库] : com.tyky.di.core.exception.XbridgeDatabaseException:Error o...

weixin_34356555的博客 1885

华为MetaERP月结加速方案:并行关账技术深度解析

【摘要】华为MetaERP并行关账技术通过创新架构设计,将传统串行月结流程(8-12小时)优化为并行执行(2-4小时)。关键技术包括:1)基于DAG引擎的任务依赖分析,实现模块/子任务三级并行;2)Saga模式分布式事务保障数据一致性;3)动态资源分配算法提升CPU利用率至60-80%。实施效果显示月结时间缩短70%,成功率提升至99.8%,错误恢复时间减少75%。该方案为大型企业ERP系统提供了高效的月结加速方案,未来还将结合AI调度与混合云扩展持续优化。

金牌架构师 1441

kettle连接mysql一直报错_Kettle连接MySQL报错的解决方法

使用Kettle报错的解决方法1.当你在navicat上面测试数据库连接的时候可以看到数据库连接成功。而在Kettle上面连接同样的库的时候报出一大段错误出来,这时候是不是感觉有点懵逼了。错误内容如下:错误连接数据库 [test库] : com.tyky.di.core.exception.XbridgeDatabaseException:Error occured while trying to...

weixin_32646781的博客 2585

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

KETTLE安装及连接MySQL数据库

kettle安装(默认电脑已经安装java,并配置环境变量,该版本kettle对应jdk1.8) kettle下载地址:https://community.hitachivantara.com/docs/DOC-1009855 下拉页面到此处,点击此处 弹出下面界面,并弹出下载框 点击浏览可更改下载地址 打开kettle界面 进入下载好的文件夹D:\pdi-ce-7.1....

南蛮滴犊的博客 6万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Kettle】使用kettle连接MySQL数据库报错

kettle连接MySQL报错 场景: kettle版本:7.1 使用kettle连接到MySQL数据库报错 错误连接数据库 [mysql_mtest_31] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the database Drive...

debimeng 3793

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: OpenCL使用GPU滤波
下一篇: Win7 home版 窗口最大化问题
IDDIALOG
博客等级 码龄23年 39粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值