- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 recent SO question 上,我解释了多次调用 RenderScript 内核将如何有效地强制所有线程在调用之间进行全局同步。
我目前正在处理按顺序应用于图像数据的多重卷积。由于卷积算法需要读取输入图像的周围像素数据,我已经实现了一个工作流程,其中我自己的自定义内核被多次调用——以确保在每一步中,来自先前卷积的所有数据都已准备好并可用于正确的坐标。到目前为止,这项技术对我来说效果很好。
然而,在我不断寻求优化的过程中,我注意到通过将中间值保留在线程的本地寄存器中而不是在内核调用之间将它们写回全局内存分配可以获得很多性能。如果我能够以这种方式链接这些卷积,事情就会运行得更快。很多。问题显然是访问周围线程的寄存器是不可能的。此外,这将需要线程同步运行,以确保阶段之间的这些中间值按预期顺序计算。
在 CUDA 和 OpenCL 中,这些问题非常普遍,并通过众所周知的屏障同步 + 共享内存平铺技术解决,而这又取决于 CUDA 线程 block 或 OpenCL 工作组的概念。我相信 RenderScript 中不存在这些概念,因为这个问题与桌面级 GPU 和移动 SoC 之间截然不同的架构密切相关。
所以我的明显问题是,在 RenderScript 中可以实现这样的事情吗?也就是说,更好地管理线程和可能的线程组,以便在它们之间更快地共享数据。
关于 Google I/O 2013 RenderScript talk由 Jason Sams 和 Tim Murray 撰写,讨论了脚本组如何能够进行一些幕后优化,例如跨设备并行化、内存平铺和内核融合;所有这一切都是通过在运行时分析组中的依赖 DAG,并在需要时自动创建分配或可能优化它们来实现的。我假设这最后一点是指融合内核,以便它们处理自己的本地数据,就像我上面提到的将数据保存在本地寄存器中并将单独的步骤组合在一个内核中的方式。
所有这些看起来都非常符合我正在寻找的东西,特别是因为我的应用程序确实是一个定义明确的相互依赖操作的 DAG(用于卷积神经网络)。因此,如果脚本组确实是这些机制的合理的以移动为中心的替代方案,我想知道是否有任何方法可以影响这些优化发生的方式和地点。或者,如果不是,运行时在多大程度上可以被信任以根据运行时的硬件从我的数据依赖项中做出正确的推断——在卷积算法的“周围”像素数据访问的特定情况下。
我意识到这一切可能仍在进行中,此时方法将高度依赖于硬件。因此,如果目前没有针对此类问题的直接解决方案——我非常愿意接受关于 RenderScript 在未来版本中可能如何处理此类工作流的推测性答案。
我将非常感谢对此的一些见解,因为它会极大地影响我自己项目的发展方向,更不用说肯定有很多其他人想知道这种通用的并行计算任务是如何实现的在 RS 中处理。
非常感谢!
最佳答案
如您所见,RS 无法直接跨线程共享数据。但是,您所描述的可以使用 ScriptGroup
来完成。 .问题是组中的每个脚本都必须是唯一的,因此您不能一遍又一遍地输入相同的脚本。至少,不像现在写的那样。您当然可以将脚本的“核心”放在 RS header 中,并从多个内核中包含它。 ScriptGroup
允许您将一个脚本的输出变成另一个脚本的输入,或者一个脚本的输出变成另一个脚本的全局字段。文档指出内核到内核(输出到输入)是更有效的用例。使用这种方法,您的同步问题将得到解决,因为引擎将在启动第二个脚本之前针对整个输入数据集执行第一个脚本,等等。脚本本身将针对硬件进行适当的并行化(使用 CPU 或 GPU/DSP ).该引擎将不必在脚本之间弹出回 Java,并且还可以在需要时管理幕后的数据分配。
您可能会注意到 ScriptGroup
利用 Script.KernelID
或 Script.FieldID
为了识别连接两个内核的确切脚本或字段。只要您使用 RS 编译器属性 pragma 显式调用内核函数,您的自定义脚本就会自动生成这些内容。然后你可以调用getKernelID_<code><name></code>
(其中“名称”是脚本中的内核函数名称)以获取内核 ID。
关于android - RenderScript 本地线程同步是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21935685/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!