C#(Csharp)+OpenCL+CLBLAS库,实现GPU高性能计算。

C#调用GPU计算。

opencl 和 cuda 是两大老牌 GPU计算库。这里选择了 opencl ,因为它不挑显卡。而且手机上也能用。甚至没有独显,集显也行,再没有CPU也行。在cpu上跑也有少量性能提升。


NOpenCL库

这里用到 C#的 NOpenCL库,调用 opencl 实现调用 显卡GPU计算。一般开发opencl 用C++。这里为了C#能用,尝试了 opencl.net库,和NOpenCL库,这两者都能实现C#调用opencl。

然而opencl.net不知道是不是我使用不正确,出现了严重的内存泄露,放弃了。所以选择 NOpenCL库。然后自己进一步封装,进一步方便使用。

opencl.net库,和NOpenCL库,在github上可以下载到。


CLBLAS库

这是 amd公布的 blas线性计算数学库的 opencl 版本。里面包含 矩阵乘法 等各种常用的数学计算函数。性能已经优化,比较成熟。当然不是 C#的库,而是C的库。因此要借助另一个库,让C#能够调用。


clMathLibraries-dotnet 库

C#对CLBLAS库的封装。包含了CLBLAS,CLFFT,CLSparse三个库。FFT自然是傅里叶变换。Sparse则是稀疏矩阵运算。都是常用数学库。


以下贴一个 矩阵乘法的测试案例。OpenCLMode是本人对NopenCL的二次封装,方便调用。


using CLMathLibraries.CLBLAS;
using NOpenCL;
using NOpenCL.SafeHandles;
using OpenCLMode.OCL;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Buffer = NOpenCL.Buffer;

using size_t = System.UInt32;
using cl_float = System.Single;
using cl_double = System.Double;
using cl_uint = System.UInt32;
using cl_mem = System.IntPtr;
using cl_event = System.IntPtr;
using cl_command_queue = System.IntPtr;
using TestTools;

namespace CAmathTest
{
    class Program
    {
        public static bool ConsoleEquale(object a, object b)
        {
            bool re = (a.Equals(b));
            Console.WriteLine("state:{0} equale {1} is {2}", a, b, re);
            return re;
        }


        static void Main(string[] args)
        {
            oclModel oclm;
            string filename = "";

            string dirbase = System.AppDomain.CurrentDomain.BaseDirectory;
            filename = Path.GetPathRoot(dirbase) + @"projectHJ\UTestOpenCLMode\OCL\OCLCode2.c";//自己写的opencl数学库。本次测试中可以省略
            if (!File.Exists(filename))
                filename = Application.StartupPath + @"\OCL\OCLCode2.c";


            string code = OpenCLMode.OCL.oclModel.LoadCode(filename);
            oclm = new OpenCLMode.OCL.oclModel(code);




            var s1 = CLBLAS.Setup();
            bool state = ConsoleEquale(s1, CLBLASStatus.clblasSuccess);
            if (!state)
            {
                return;
            }

           
            
            const int M = 1024;
            const int N = 1024;
            const int K = 512;


            //float alpha
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值