原则
我知道,如此简单的计算不值得精心并行化。就是这样一个例子,数学运算只是一些更有趣的计算的占位符。
[伪代码]
var id = 0,
do {
id = getGlobalId();
output[id] = input[id] * input[id];
} while (inRange(id) && output[id] !== 25);
最特殊的表达方式可能是:output[id] !== 25
. 这意味着: 如果input
有四个元素(按此顺序):[8, 5, 2, 9]
,那么output
应该是[64, 25]
和2
or的平方9
不会被用作的项output
(因为output[id] !== 25
是true
forid = 1
和input[id] = 5
)。
如果您正在优化这段代码,您可能希望提前计算每个的平方input[id]
(不证明第二个while
条件),但不能保证结果稍后是相关的(如果先前计算的结果是 25 ,当前计算的结果是无趣的)。
概括地说,我说的是计算结果 output[id]
( output[id] = calculateFrom(input[id]);
) 可能与每个都不相关的情况id
——结果 ( output[id]
) 的需要取决于另一个计算的结果。
我的目标
我想使用OpenCL内核和队列以尽可能并行和高性能的方式执行这个循环。
我的想法
我想:为了能够并行化这样的
do...while
循环,我们应该output[id] = calculateFrom(input[id]);
提前同时进行一些计算()(不知道结果output[id]
是否有用)。如果先前的结果是25
,那么结果output[id]
就会被拒绝。也许我们应该考虑 的概率
output[id] !== 25
。如果概率非常高,我们不会提前进行很多计算,因为它们的结果可能会被拒绝。如果概率绝对低,那么我应该提前做更多的计算。我们应该听听处理单元的当前状态。如果它已经过度紧张,我们不应该进行不重要的提前计算。但是,如果有足够的资源来处理提前计算,那为什么不呢。- 因为:如果提前计算和之前的计算(这些提前计算所依赖的)被同时处理,那么提前附加也可能减慢之前的计算 - (见我的第二个问题)
我的问题
- 并行化这些程序是明智的还是高性能的?
- 我应该根据哪些标准来决定处理单元是否有足够的资源来执行我的提前计算任务?或者:我怎么知道我的处理单元是否过度紧张?
- 您是否知道任何其他并行化此类
do...while
s 的计划?你对此有什么想法吗?
我希望我想告诉你的总是很清楚。但如果不是,请评论我的问题。- 感谢您的回答和帮助。