问题标签 [directcompute]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2587 浏览

c++ - HLSL 获取代码中的线程组数和线程数

我的问题特别涉及 ComputeShader,HLSL 代码。因此,DeviceContext.Dispath(X, Y, Z)产生 X * Y * Z 组,每个组在属性中设置了 x * y * z 个单独的线程[numthreads(x,y,z)]。问题是,如何获得已调度的线程组总数和组中的线程数?让我解释一下为什么我想要它 - 我打算处理的数据量可能会有很大差异,所以我的方法应该适应输入数组的大小。当然,我可以在常量缓冲区中发送 Dispath 参数以使其可从 HLSL 代码中使用,但是组中的线程数呢?我正在寻找类似GetThreadGroupNumber()和的方法GetThreadNumberInGroup()。我很感激任何帮助。

0 投票
0 回答
2418 浏览

c++ - ID3D12Device::CreateComputePipelineState 失败 (E_INVALIDARGS)

我遇到了一个不寻常的问题 - 当我尝试创建 Compute PSO 时,函数因 E_INVALIDARGS 而失败。这可能是由于没有可用的 CachedPso,尽管我在 MSDN 上看到 Graphics PSO 是在没有缓存数据的情况下创建的。

所以这里是代码本身。Serializing Root Signature 和 RS 创建都报告 S_OK,但 CreateComputePS 失败。Shader 由 Visual Studio 编译(着色器版本 5.1),然后它是 ReadFileToBlob'ed。

UPD:输出日志中有一个错误(实际上没有抛出异常,只是一条文本消息,很难注意到),它在调用 CreateCompPS 后立即出现:DirectComputeInteropLib.exe 中在 0x774CD928 处抛出异常:Microsoft C++ 异常:_com_error 在内存位置0x001DEFF4。

0 投票
2 回答
1334 浏览

bitmap - 将 SlimDX.Direct3D11 Texture2D 转换为 .Net 位图

将 .Net 位图转换为 SlimDx Texture2D 的工作速度非常快,如下所示: http ://www.rolandk.de/index.php?option=com_content&view=article&id=65:bitmap-from-texture-d3d11&catid=16:blog&Itemid=10

为了以正确的格式将纹理转换回.Net位图,我使用它,但它非常慢:

有没有更快的方法???我尝试了很多,例如:

但是 DataRectangle 的数据正好是我在 DataStream 中需要的数据的 8 倍

有人可以帮忙吗?复制我的数据大约需要整个计算时间的 50%。如果这可以解决,我的应用程序会更快......

0 投票
0 回答
77 浏览

c - C背景的DirectCompute

有兴趣开发一些图像分析算法。

GPU 计算的真正初学者,几年前我是一名使用 C 编程的物理研究员,只研究算法而不是 GUI 端,使用简单的工具,如智能文本编辑器和 gcc。

对 CUDA 不感兴趣,因为不想被 NV hw 卡住,在 OpenCL 上进行了快速测试,只是使用 Visual Studio Express + AMD SDK + 第一个基本内核设置了环境,需要搞乱创建一个简单的“hello word”等价物。

我想要最简单的可能开始路径来专注于算法开发,即矩阵乘以 5 分钟并运行。考虑到我的背景,使用 DC 会更顺利地开始吗?在支持 DC 5.0 的旧机器上工作。

0 投票
1 回答
1529 浏览

unity3d - 在 GPU 上设置附加/使用缓冲区的计数器?

我有一个使用两个计算着色器的应用程序。Shader #1生成数据x并将其存储在 中A,绑定为附加缓冲区。Shader #2在所有xfrom上运行A,绑定为消耗缓冲区。我想通过添加来扩展它Shader #3,它在所有的xin上运行A,生成y一个新的缓冲区B- 但我仍然想像以前一样Shader #2运行x

也就是说,我想对追加/使用缓冲区的所有元素运行操作,但不“消耗”它们。

如果我理解正确,消耗一个元素只会减少一个隐藏的计数器,所以我应该能够通过存储满时的计数来多次消耗一个缓冲区,并在从它消耗的着色器调用之间重置它。

问题是我的平台 - Unity - 只有一种方法 ( SetCounterValue()) 需要我传入新的计数器值。也就是说,我需要在重新设置之前将计数器值获取到 CPU 内存,这将强制 GPU/CPU 之间进行同步并降低性能。

是否可以完全在 GPU 上设置消耗缓冲区的计数器值?

如果没有,是否可以在不使用消耗的情况下迭代消耗缓冲区?

(我想到只是将缓冲区绑定为常规 UAV 资源并以这种方式进行迭代,但文档对于是否支持这一点模棱两可。例如,“这些资源不使用资源变量。”请参阅资源本身,还是观点?)

0 投票
1 回答
82 浏览

directx - 计算着色器中是否支持每通道 8 位和每通道 16 位 UAV?

我正在研究计算着色器。它需要将一些纹理作为 UAV 输出。其中一些具有 8 位组件,一些具有每个通道 16 位。考虑这一行:

我将 R8G8B8A8_UNORM 纹理绑定到它,输出为黑色,但是当我绑定 R32G32B32A32_FLOAT 纹理时,它会保存正确的值。所以它似乎有纹理格式的问题。

我该怎么做才能输出到每通道 8 位或 16 位纹理?

PS:我的测试设备有一个 G eforce 710 GT GPU。

0 投票
1 回答
256 浏览

compute-shader - 尝试访问 StructuredBuffer 时出现编译错误

我想StructuredBuffer<int>在计算着色器中访问 a 但出现错误:

“Particle.compute”中的着色器错误:Particle.compute(28) 的索引表达式中预期的数组、矩阵、向量或可索引对象类型(在 d3d11 上)

编码:

错误点线int particleCount = particleCount[0];。这是为什么?

着色器背后的整个想法是我们有两个缓冲区。我们用来自 CPU 的一些数据(我们称它们中的每一个)填充一个,Particle然后在着色器中使用来自缓冲区的数据,处理它,然后附加到另一个缓冲区。然后我们交换缓冲区并进行另一次迭代。缓冲区保存缓冲区保存的particleCount当前 s 计数,Particle并且该if子句防止消耗比可用更多的粒子。

0 投票
1 回答
1051 浏览

compute-shader - D3D12 使用后缓冲表面作为无序访问视图 (UAV)

我为学校项目制作了一个简单的光线追踪器,计算着色器应该用于对三角形或其他一些图元进行着色。为此,我想直接在计算着色器中写入后缓冲表面,然后立即呈现结果。我确定这在 DX11 中是可能的,尽管我似乎无法让它在 DX12 中工作。

我无法收集有关此的太多信息,但我发现这个 gamedev 线程讨论了我试图弄清楚的完全相同的问题,他们似乎得出了我的解决方法的结论:写入中间纹理然后采样在管道中。我不能完全接受这在 dx12 中是不可能实现的。为什么要删除该功能?是不是排队系统消除了一些开销,使得它没有必要拥有这个功能?

有没有什么方法可以实现光线追踪器,而无需写入单独的纹理,然后在管道中采样或将其复制到后台缓冲区?实现性能的最佳选择是什么?

0 投票
1 回答
954 浏览

c# - 使用计算着色器将纹理转换为浮点值的一维数组

我对计算着色器(通过 Unity 的 DirectCompute)有一个相当简单的要求。我有一个 128x128 纹理,我想将该纹理的红色通道转换为一维浮点数组。我需要经常这样做,所以只是在每个纹素上做一个 cpu 端的循环不会削减它。

初始化:

这是 C# 方法:

和整个计算着色器:

C# 方法返回一个预期大小的数组,它通常与我的预期相符。然而,即使我的输入纹理都是红色的,仍然会有一些零。

0 投票
1 回答
343 浏览

directx-11 - HLSL 编译器省略了关键语句

我有这个遍历二叉树的计算着色器。它曾经与单独安装的 DirectX SDK(6 月)和编译器 #43 一起正常工作。

然而,编译器#46 和#47(分别来自 Windows SDK 8.0 和 8.1)似乎省略了两行非常关键的代码,它们使着色器循环运行,一遍又一遍地检查相同的树节点,直到 Windows 重新启动图形驱动程序(通过查看反汇编验证)。

这是展示此行为的最小代码示例:

以及相应的组件:

当我省略第一行时continue,它会为这两行生成代码,但随后它也被破坏了。

知道如何让更新的编译器生成该代码吗?