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