- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当使用同时运行主显示器的 GPU 在 Windows 上运行长时间的 OpenCL 计算时,操作系统可能会用 Timeout Detection and Recovery 中断计算。 .
根据我的经验(Java,通过 NativeLibs4Java 使用 JavaCL,使用 NVidia GPU)这在调用 clEnqueueReadBuffer 时表现为“资源不足”(cl_out_of_resources)错误。
问题是当 OpenCL 程序出于其他原因(例如,由于访问无效内存)时,我得到了完全相同的消息。
是否有一种(半)可靠的方法来区分由 TDR 引起的“资源不足”和由其他问题引起的“资源不足”?
或者,我能否至少可靠地(在 Java 中/通过 OpenCL API)确定用于计算的 GPU 也在运行显示?
我知道 this question然而,答案与 clFinish 不返回的情况有关,这对我来说不是问题(到目前为止,我的代码从未在 OpenCL API 中保持卡住状态)。
最佳答案
Is there a (semi) reliable way to distinguish between an "Out of Resources" caused by TDR and an "Out of Resources" caused by other problems?
1)
如果可以访问
KeyPath :
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers
KeyValue : TdrDelay ValueType : REG_DWORD ValueData : Number of
seconds to delay. 2 seconds is the default value.
从 WMI 乘以
KeyPath : HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers
KeyValue : TdrLimitCount
ValueType : REG_DWORD
ValueData : Number of TDRs before crashing. The default value is 5.
再次使用 WMI。当你乘以这些时,你得到 10 秒。而且,你应该得到
KeyPath :
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers
KeyValue : TdrLimitTime ValueType : REG_DWORD ValueData : Number of
seconds before crashing. 60 seconds is the default value.
应该从 WMI 读取 60 秒。
对于此示例计算机,在最终崩溃限制 60 秒之前需要 5 x 2 秒+1 额外延迟。然后您可以从应用程序检查最后一个秒表计数器是否超过了这些限制。如果是,可能是 TDR。在这些之上还有一个线程退出驱动程序的时间限制,
KeyPath :
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers
KeyValue : TdrDdiDelay ValueType : REG_DWORD ValueData : Number of
seconds to leave the driver. 5 seconds is the default value.
默认为 5 秒。访问无效的内存段应该会更快退出。也许您可以将这些来自 WMI 的 TDR 时间限制增加到几分钟,这样它就可以让程序计算而不会因为抢占饥饿而崩溃。但是更改注册表可能很危险,例如,您将 TDR 时间限制设置为 1 秒或其中的一部分,然后 Windows 可能永远不会在没有持续的 TDR 崩溃的情况下启动,因此只读取这些变量必须更安全。
2)
您将全部工作分成更小的部分。如果数据不可分离,则复制一次,然后开始将长时间运行的内核作为非常短范围的内核排队 n 次,并在任意两次之间进行一些等待。
然后,您必须确保 TDR 已被消除。如果这个版本跑了,而long-running-kernel不跑,就是TDR故障,反之就是内存崩溃。看起来像这样:
short running x 1024 times
long running
long running <---- fail? TDR! because memory would crash short ver. too!
long running
再试一次:
short running x 1024 times <---- fail? memory! because only 1ms per kernel
long running
long running
long running
Alternately, can I at least reliably (in Java / through OpenCL API) determine that the GPU used for computation is also running the display?
1)
使用两个设备的互操作性属性:
// taken from Intel's site:
std::vector<cl_device_id> devs (devNum);
//reading the info
clGetGLContextInfoKHR(props, CL_DEVICES_FOR_GL_CONTEXT_KHR, bytes, devs, NULL))
这给出了可互操作的设备列表。如果你不想使用它,你应该得到它的 id 来排除它。
2)
让另一个线程运行一些 opengl 或 directx 静态对象绘图代码以保持其中一个 GPU 忙碌。然后使用另一个线程同时测试所有 gpus 以获取一些微不足道的 opencl 内核代码。测试:
执行此操作时不应在设备之间复制任何数据,这样 CPU/RAM 就不会成为瓶颈。
3)
如果数据是可分离的,那么你可以使用分而治之的算法让任何 gpu 只在它可用时得到它自己的工作并让显示部分更灵活(因为这是性能感知解决方案并且可以类似短期运行的版本,但调度是在多个 gpus 上完成的)
4)
我没有检查因为我卖掉了我的第二个 gpu 但是,你应该试试
CL_DEVICE_TYPE_DEFAULT
在您的多 GPU 系统中测试它是否获得显示 GPU。关闭电脑,将显示器电缆插入其他卡,然后重试。关机,换牌位,再试。关机,取出其中一张卡,只剩下 1 个 gpu 和 1 个 cpu,再试一次。如果所有这些只提供显示 gpu,那么它应该将显示 gpu 标记为默认值。
关于java - OpenCL:区分计算失败与 TDR 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40503644/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!