问题标签 [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.
random - 链接错误,包括 C++ AMP 中的随机数库
我正在使用Codeplex的C++ AMP tinymt 库来生成随机数。该库工作正常,除了当我在同一个项目中的两个不同文件中时,出现链接错误,提到重新定义某些变量tinymt_lib::tinymt_dc_data和tinymt_dc_data_32。#include <amp_tinymt_rng.h>
#pragma once
考虑到我已经在每个标题中使用,什么是摆脱这个问题的好方法?我正在使用 Visual Studio 2013 Professional。
作为一个附带建议,在没有特殊库开销的情况下生成随机数的更简单方法是什么?我不担心序列不是安全随机的、简单的random()
或rand()
足够的。
windows - 是否可以在多个 GPU 上运行直接计算?
我对 DirectCompute 感兴趣,我想知道是否有可能,将两个不同的图形适配器连接到计算机以同时在两者上使用 Direct Compute,就像在 CUDA 中一样。据 ai 所知,在 directcompute 中调度计算机着色器是异步的,那么是否可以将计算机着色器调度到使用不同适配器创建的不同设备?
提前致谢!
directx - 卷积过滤器输出错误的颜色值
我刚刚开始学习 DirectCompute,出于学习目的,我想制作一个简单的卷积过滤器来模糊纹理。我编写了以下计算着色器来模糊纹理:
我用以下参数调用:
此着色器采用当前像素及其 48 个相邻像素的平均颜色值,从而产生模糊效果。
现在模糊部分工作正常,但着色器输出的颜色似乎不正确。为了测试着色器,我使用了一个在黑色背景上具有纯白色形状的简单图像。我期望的输出是黑色背景上的模糊纯白色形状,但白色形状不再是白色,而是灰色。现在我已经多次检查了我的代码,但我找不到问题出在哪里。每个纹理具有相同的 512x512 像素大小。
这是我的输入图像:
这是我得到的输出:
任何帮助将不胜感激。
感谢:D
unity3d - DirectCompute atomic counter
In a compute shader (with Unity) I have a raycast finding intersections with mesh triangles. At some point I would like to return how many intersections are found.
I can clearly see how many intersections there are by marking the pixels, however if I simply increment a global int for every intersection in the compute shader (and return via a buffer), the number I get back makes no sense. I assume this is because I'm creating a race condition.
I see that opengl has "atomic counters" : https://www.opengl.org/wiki/Atomic_Counter, which seem like what I need in this situation. I have had no luck finding such a feature in either the Unity nor the DirectCompute documentation. Is there a good way to do this?
I could create an appendBuffer, but it seems silly as I literally need to return just a single int.
c++ - DX11 Compute Shader 只写入一个索引
我真的无法弄清楚这里发生了什么。
我有一个计算着色器,它接收 FFT 结果(来自真实输入)并计算每个 bin 的功率,将它们存储在不同的缓冲区(UAV)中。FFT 实现是 D3DCSX 库的实现。
有问题的着色器:
缓冲区创建代码:
调度代码:
最后是 CPU 映射代码:
发生的情况是这个着色器似乎让每个线程都写入输出缓冲区中的相同索引。映射缓冲区总是为第一个 bin 读取正确的值,然后为每个其他 bin 读取 0.0f。CPU 上的等效代码运行良好。奇怪的是我已经放置了条件并且知道它bin
不只是 0,而且 bin 0 之外的每个 bin 的幂也不总是 0.0f。我还尝试使用 for 循环在同一个线程上写入多个 bin,并且发生了同样的事情。我究竟做错了什么?
我有一种预感,这是问题根源所在的缓冲区创建代码或映射代码。我知道我在 GPU 上运行了正确数量的线程并且调度 ID 是正确的,这是错误的 CPU 端结果。
directcompute - 关于计算着色器 DispatchThreadID 的问题?
第一个问题:
在这段代码中,是否DispatchThreadID.x
和DispatchThreadID.y
具有相同的值,例如 x 的线程 17 和 y 的线程 17?
第二个问题:
我可以写这个吗?
回答是或否就足够了,但如果不是,请简要说明原因。
c++ - DirectX 11 - 计算着色器:写入输出资源
我刚刚开始使用 DirectX 11 中的计算着色器阶段,在写入计算着色器中的输出资源时遇到了一些不需要的行为。我似乎只得到零作为输出,据我了解,这意味着在计算着色器中执行了越界读取。(越界写入导致无操作)
创建计算着色器组件
输入资源
ID3D11Buffer*
首先,我为输入数据创建一个。在创建用于输入到计算着色器阶段的 SRV 时,这将作为资源传递。如果输入数据永远不会改变,那么我们可以在创建 SRV 后释放ID3D11Buffer*
对象,因为 SRV 将充当资源的句柄。
但是,我想更新每一帧的输入数据,所以我只是保留缓冲区供我使用以进行映射。
使用新创建的缓冲区作为资源创建 SRV
输出资源
现在我需要为 Compute 着色器创建一个要写入的资源。我还将创建要读取的缓冲区的系统内存版本。我将使用ID3D11DeviceContext::CopyResource 方法将数据从连接到无人机的计算着色器输出缓冲区复制到系统内存版本以执行映射并将其内容保存回系统内存。
创建计算着色器可以写入的读写缓冲区
创建缓冲区的系统内存版本以从中读取结果
为计算着色器创建 UAV 以写入结果
执行计算着色器(每帧)
C++
HLSL
我很抱歉这个问题的内容量很大。我已经仔细构建了它,因此您可能会发现它更容易获得概述。
传递给着色器的元素数量为 32。
对我的问题有什么建议吗?谢谢!
c++ - DirectCompute 着色器数据输入/输出
我正在学习 DirectCompute,但我坚持使用 StructuredBufferes。事情是我了解到,要向着色器提供数据,我需要使用视图 - SRV 或 UAV,具体取决于我想要实现的目标。但是来自微软网站的代码示例并没有解释,在 C++ 代码中定义的视图如何与在着色器代码中定义的特定 Buffer 相对应。但是,有一个 hlsl 关键字我不太明白 - register()
。在示例中有三个缓冲区:
在 C++ 代码中,作者只需设置 ComputeShader、1 个 UAV、2 个 SRV,然后调用 Context.Dispatch(,,)(假设他们之前已准备好所有缓冲区和视图)。所以问题是 - 我如何理解特定的 SRV(其中有两个)为特定的 StructuredBuffer 提供数据?它是否由寄存器编号控制(例如首先填充寄存器(t0),寄存器(t1)-第二)。如果是,如果我想先向第二个缓冲区提供数据,然后填充第一个缓冲区怎么办?我觉得自己错过了一些非常重要的东西,但是在之前的教程中,由于 EffectVariales 和.GetVariableBy方法,我使用的一切都变得容易多了。提前致谢。
gpgpu - DirectX 11 Compute Shader 设备同步?
背景:在 GPGPU 平台上执行基准测试/比较。
问题:调度 DirectX 11 计算着色器时的设备同步。
寻找相当于cudaDeviceSynchronize()的clFinish(...)来公平比较我的算法的执行方式。
CUDA 和 OpenCL 函数在阻塞/非阻塞问题上更加清晰。然而,DirectCompute 与图形管道(我正在学习并且非常不熟悉)更相关,因此我很难确定 Dispatch 调用是否阻塞或之前的内存分配/传输是否已完成。
代码 DX_1:
代码 DX_2:
结果(2^2 到 2^11 个元素的平均时间):
注意:这些时间是在连接屏幕的桌面 GPU 上运行的,预计会有一些不稳定的时间。时间不应该包括主机到设备的缓冲区传输。
注意 2:这些是非常短的序列(4 - 2048 个元素),有趣的测试是针对最多 2^26 个元素的问题大小进行的。
c++ - DirectX 11 - 计算着色器,将数据从 GPU 复制到 CPU
我刚刚开始使用直接计算,试图将我一直在研究的流体模拟移动到 GPU 上。我在这里发现了一个非常相似(如果不相同)的问题,但是我的问题的解决方案似乎与他们的不同;我确实有我的 CopyResource 正确的方式!与粘贴的问题一样,当从 GPU 复制回来时,我只会得到一个充满 0 的缓冲区。我真的看不到错误,因为我不明白我是如何超出界限的。我将为即将发生的大量代码粘贴道歉,但我想确保我没有任何设置错误。
输出缓冲器、无人机和系统缓冲器设置
在我的帧循环中运行着色器
HLSL
我在开始一帧之后和结束帧之前调度计算着色器。我一直在尝试将着色器调度调用移动到结束场景之外和当前等之前,但似乎没有任何影响该过程。这个好像搞不定啊!