问题标签 [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 回答
1060 浏览

directx - DirectX 计算着色器:如何编写具有可变数组大小参数的函数?

我正在尝试在计算着色器(HLSL)中编写一个函数,该函数接受一个参数是不同大小的数组。编译器总是拒绝它。

示例(不工作!):

如果我在 TestFunc() 中给出一个数组大小,那么编译器在调用 TestFunc() 传递该特定数组大小但拒绝调用另一个大小时会很高兴。

0 投票
1 回答
532 浏览

directx - DirectX 计算着色器 (HLSL):如何访问字符串中的单个字符?

在 DirectCompute 着色器中,具有采用字符串类型参数的函数,如何访问单个字符?

例子:

编译器抱怨 S[I]:“错误 X3121:索引表达式中预期的数组、矩阵、向量或可索引对象类型”。

任何想法?

0 投票
2 回答
451 浏览

directx - 设备花费了不合理的时间来执行其命令

我正在将 C 代码移植到 HLSL(计算着色器)。编译器对其中一个 for 循环很着迷。在运行时,显示设备驱动程序检测到执行代码的时间不合理。

这是带有违规 for 循环的部分源代码:

在运行时,我收到以下调试消息:

D3D11 错误:ID3D11Device::RemoveDevice:设备删除已被触发,原因如下(DXGI_ERROR_DEVICE_HUNG:设备执行其命令的时间不合理,或硬件崩溃/挂起。因此,TDR(超时检测和恢复)机制已被触发。当前的设备上下文在挂起发生时正在执行命令。应用程序可能希望重新生成并回退到不太积极地使用显示硬件)。执行错误 #378:DEVICE_REMOVAL_PROCESS_AT_FAULT]

如果我注释掉这两个 for 循环行,一切都很好(当然除了最后一部分缺少他的最后一部分的最终结果)。

FloatToAsciiNoExponent()是将他的第一个参数转换为存储在第二个参数(uint 数组)中的列表或 ascii 代码的函数。最后一个参数是转换的计数基数。它已经过验证。

IntToAscii()是将他的第一个参数转换为存储在第二个参数(uint 数组)中的 ascii 代码列表的函数。它已经过验证。

我移植的原始 C 源代码可以在这里找到:https ://searchcode.com/codesearch/view/14753060/

我在 Windows 7 和 2010 年 6 月的 DirectX SDK 上运行(最后一个在 Windows 7 上运行)。已执行 Windows 更新并安装了每个更新。显卡是 NVidia Quadro K4200,具有 24GB RAM,驱动程序版本为 431.02。

任何帮助表示赞赏。

0 投票
1 回答
675 浏览

directx - warning X4000: use of potentially uninitialized variable

HLSL compiler emit the error message "warning X4000: use of potentially uninitialized variable" with the following code:

I don't understand that warning. There is no variable at all used in the offending line!

Any help appreciated.

0 投票
1 回答
1073 浏览

directx - 警告 X3557:循环仅执行 0 次迭代,强制循环展开

编译器产生“警告 X3557:循环仅执行 0 次迭代,强制循环展开”,我不明白为什么。

这是源代码。它是一个重新访问的 itoa() 函数,用于 HLSL 在 uint 数组中生成结果 ascii 代码。

我试图重写while循环,但这并没有改变任何东西。还尝试使用属性 [fastopt] 没有成功。据我所见,该函数产生了正确的结果。

任何帮助表示赞赏。

0 投票
1 回答
3539 浏览

directx - DirectCompute:如何从 RWTexture2D 中读取数据?

我有以下缓冲区:

计算着色器使用此缓冲区来渲染计算图像。要在该纹理中写入像素,我只需使用类似于以下的代码:

这很好用,我的计算图像在屏幕上正确呈现。

现在在计算着色器的某个阶段,我想读回一个已经计算过的像素并再次处理它。

编译器返回错误:

任何帮助表示赞赏。

0 投票
2 回答
1128 浏览

directx - 在 HLSL DirectCompute 着色器中实现自旋锁

我尝试在计算着色器中实现自旋锁。但我的实现它似乎没有锁定任何东西。

这是我实现自旋锁的方法:

背景:我需要一个自旋锁,因为我必须计算一个大型二维数组中的数据总和。总和是双倍的。用单线程和双循环计算总和会产生正确的结果。使用多线程计算总和会产生错误的结果,即使在计算总和时引入自旋锁以避免冲突也是如此。

我不能使用 InterLockedAdd,因为总和不适合 32 位整数,而且我使用的是着色器模型 5(编译器 47)。

这是单线程版本,产生正确的结果:

以下是多线程版本。这个版本在每次执行时都会产生相似但不同的结果,这是由无效的锁引起的。

使用的数据:

发货代码:

GetPixel16BitGrayFromRawImage 函数访问 RawImage 字节地址缓冲区以从灰度图像中获取 16 位像素值。它产生了预期的结果。

任何帮助表示赞赏。

0 投票
1 回答
142 浏览

directx - DirectCompute 着色器:如何摆脱警告 X3205: 'round'

在计算着色器模型 5 中,我得到了双精度浮点值的一些计算结果。我必须将值分配给一个整数变量,然后我收到警告:

我理解警告,但在我的情况下,在运行时浮点值永远不会超过整数可接受的值。该代码产生了预期的结果,所以我想关闭特定违规行的警告。

我没有找到如何关闭特定警告的方法,我喜欢编写不产生任何警告的代码,或者如果它们是,则检查它们是否是误报。

任何帮助表示赞赏。

0 投票
1 回答
137 浏览

multithreading - 多维数组处理的 DirectCompute 多线程性能(线程和线程组)

我知道 Disptach(x, y, z) 将定义实例化的线程组数, numthreads(n, m, p) 给出每个组的大小。

结合在一起,Dispatch 和 numthreads 给出了线程的总数。我还理解调度参数用于将参数传递给每个线程。

问题:

1) I 组 J 线程和 I 线程上的 J 组之间有性能差异吗?两个选项都提供相同数量的线程。

2)假设我必须处理一个仅在运行时才知道大小的二维矩阵,使用 Dispatch(DimX, DimY, 1) 和 numthreads(1, 1, 1) 很方便,这样我每个矩阵元素都有一个线程其位置由 DTid.xy 给出。由于 numthreads() 参数是在编译时确定的,我如何才能获得处理具有不是线程组大小倍数且在编译时未知的矩阵所需的确切线程数?

0 投票
0 回答
171 浏览

reflection - DirectCompute D3DReflect GetConstantBufferByIndex 总是返回空指针

我试图通过调用 D3DCompile() 或 D3DCompile2() 来获取由我的程序编译的计算着色器的反射信息。

编译正常,代码正确执行。

然后我调用 D3DReflect 来获取针对已编译代码的反射器。

一旦我有了反射器,我就调用 reflector->GetDesc(&ShaderDesc);

这非常有效:ShaderDesc 结构报告 ConstantBuffers 等于 1,这是正确的。

然后我调用 reflector->GetConstantBufferByIndex(0) ,它总是返回空指针。

怎么了 ?

我的环境:Windows 10 完全最新,NVidia Quadro K4200 上的 DirectX11 驱动程序 24.21.14.1240 日期为 2019 年 7 月 21 日,D3DCompiler_47.dll 日期为 2019 年 3 月 19 日。

编辑:在着色器中,常量缓冲区定义如下:

亲切的问候