gpt4 book ai didi

opencl - OpenCL 内核执行时间过长导致崩溃

转载 作者:行者123 更新时间:2023-12-02 01:03:28 32 4
gpt4 key购买 nike

我目前正在构建一个 ray marcher 来查看像 mandelbox 等东西。它工作得很好。但是,在我当前的程序中,它使用每个 worker 作为从眼睛转换的光线。这意味着每个 worker 有大量的执行。因此,当查看一个极其复杂的对象或尝试以足够大的精度进行渲染时,它会导致我的显示驱动程序崩溃,因为内核在单个 worker 上执行的时间太长。我试图避免更改我的注册表值来延长超时时间,因为我希望此应用程序可以在多台计算机上运行。

有什么办法可以解决这个问题吗?就目前而言,每个工作项的执行完全独立于附近的工作项。我考虑过为 GPU 订阅一个缓冲区,该缓冲区将存储该射线上的当前进度,并且只执行少量迭代。然后,我会一遍又一遍地调用该程序,结果有望更加完善。这个问题是我不确定如何处理分支光线(例如反射和折射),除非我有每个预期的最大数量。

有人对我应该如何解决这个问题有任何指示吗?我是 OpenCL 的新手,遇到这个问题已经有一段时间了。我觉得好像我做错了什么或主要是滥用 OpenCL,因为我的单个工作项背后有很多逻辑,但我不知道如何拆分任务,因为它只是一系列步骤、检查和调整。

最佳答案

您遇到的崩溃是由 nVIDIA 的硬件看门狗定时器引起的。此外,操作系统也可能会检测到 GPU 没有响应并重新启动它(至少 Windows7 会这样做)。

您可以通过多种方式避免它:

  • 改进/优化您的内核代码以减少时间
  • 购买更快的硬件($$$$)
  • 禁用看门狗定时器(但这不是一件容易的事,并不是所有的设备都有这个功能)
  • 通过启动多个小内核减少每次排队到设备的工作量(注意:通过启动每个小内核)

最简单直接的解决方案是最后一个。但如果可以,也请尝试第一个。


例如,这样的调用(1000x1000 = 1M 工作项,全局大小):

clEnqueueNDRangeKernel(queue, kernel, 2, NDRange(0,0)/*Offset*/, NDRange(1000,1000)/*Global*/, ... );

可以分成许多小调用 ((100x100)x(10x10) = 1M )。由于全局大小现在小了 100 倍,因此不应触发看门狗:

for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
clEnqueueNDRangeKernel(queue, kernel, 2, NDRange(i*100,j*100)/*Offset*/, NDRange(100,100)/*Global*/, ... );

关于opencl - OpenCL 内核执行时间过长导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395258/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com