dotnet 让 C# 可以通过动态生成 HLSL 使用 DX12 的 GPU 并行计算库 ComputeSharp 的简介
本文来安利大家一个超强的库,这个库可以让你的 C# 代码利用上 GPU 显卡的性能,进行一些并行计算。这个库是基于 DirectX12GameEngine 的 ComputeSharp 库。在这个库里面将会动态生成 HLSL 代码,使用着色器的方式在 GPU 上跑起来
这个 ComputeSharp 库在 GitHub 完全开源,请看 https://github.com/Sergio0694/ComputeSharp
在开始之前,按照 dotnet 的基本玩法,先通过 NuGet 安装库,然后使用,咱先来创建一个空白的项目。这个 ComputeSharp 库能支持的 .NET Standard 2.1 和以上的版本
通过 NuGet 安装 ComputeSharp 库,在 NuGet 包命令行输入下面代码
Install-Package ComputeSharp
或者在 csproj 文件上添加下面代码
<ItemGroup>
<PackageReference Include="ComputeSharp" Version="1.4.1" />
</ItemGroup>
下面使用一个并行给一个 float 数组设置顺序值的例子告诉大家如何使用这个库
先定义 Shader 的实现,请看下面代码
public readonly struct MyShader : IComputeShader
{
// 这是特意的命名,请不要更改
public readonly ReadWriteBuffer<float> buffer;
public MyShader(ReadWriteBuffer<float> buffer)
{
this.buffer = buffer;
}
public void Execute(ThreadIds ids)
{
buffer[ids.X] = ids.X;
}
}
这段代码将会被用来生成 HLSL 代码,因此一些属性的命名是不能更改的
然后从 GPU 中申请一段内存
// Allocate a writeable buffer on the GPU, with the contents of the array
ReadWriteBuffer<float> buffer = Gpu.Default.AllocateReadWriteBuffer<float>(1000);
接着在 GPU 上运行
// Run the shader
Gpu.Default.For(1000, new MyShader(buffer));
运行完成之后,可以使用下面代码拿到值
// Get the data back
float[] array = buffer.GetData();
使用下面代码可以输出数组里面的值
Console.WriteLine(string.Join(",", array.Select(temp => temp.ToString())));
此时可以看到这个数组里面的值都按照顺序被设置了对应的值
本文代码放在github欢迎小伙伴访问
还有更多高级的用法,还请看 https://github.com/Sergio0694/ComputeSharp
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 打卡群刷题总结0924——最长上升子序列
- VS2017中使用QT Chart图表
- C++核心准则T.81:不要混用继承层级和数组
- C++核心准则T.83:不要将成员函数定义为模板虚函数
- C++核心准则T.84:使用非模板核心实现提供稳定的ABI接口
- C++核心准则T.120:只在确实有需要时使用模板元编程
- C++核心准则T.121:模板元编程主要用于模仿概念
- C++核心准则T.122:使用模板在编译时计算类型
- C++核心准则T.123:使用常量表达式函数在编译时求值
- Java基础 【类之间的关系】
- MySql 学习之路-基础
- (有趣的)项目实战:Java实现计算机自动关机
- 猜生日 Java小游戏
- KDD Cup 2020多模态召回比赛亚军方案与搜索业务应用
- 一文快速入门分库分表(必修课)