2

我正在转换一种算法以利用 C++ AMP 提供的大规模加速。我所处的阶段是将 for 循环放入已知的 parallel_for_each 循环中。

通常这应该是一项简单的任务,但它看起来比我最初想象的要复杂。这是一个嵌套循环,我每次迭代使用 4 步递增:

for(int j = 0; j < height; j += 4, data += width * 4 * 4)
{
    for(int i = 0; i < width; i += 4)
    {

我遇到的麻烦是索引的使用。我似乎无法找到一种方法将其正确地放入 parallel_for_each 循环中。使用 2 级索引是可行的方法,但通过分支操作它会损害性能增益。

我发现了一个类似的帖子:Controlling the index variables in C++ AMP。它还涉及索引操作,但增量方面并未涵盖我的问题。

亲切的问候,

强制施法

4

1 回答 1

0

You should think of tiles as a mechanism for partitioning work across the GPU not as an indexing mechanism. As you found limiting yourself to a 4x4 tile is likely to lead you into a performance bottleneck.

Can't you just do the following:

auto compute_domain = concurrency::extent<2>(height / 4, width / 4);

parallel_for_each(accl_view, compute_domain, [=](index<2> idx) restrict(amp)
{
    int j = idx[0] * 4;
    int i = idx[1] * 4;

    // Your algorithm here...
}
于 2014-08-20T04:44:17.710 回答