c++ - 我如何使用 C++ AMP 并行化以下循环?

标签 c++

我在 C++ 中有以下循环

dword result = 0;
for ( int i = 0; i < 16; i++ ) {
    result |= ( value[i] << (unsigned int)( i << 1 ) );
}

我想在 amp 中并行化它。我知道它可能比上面的实际非并行版本慢,但我想这样做是为了了解更多关于 AMP 的知识。

我的想法是并行遍历值数组:

enter image description here

并用newarray[0] = value[0] << (unsigned int)(0 << 1 )填充一个新数组, newarray[1] = value[1] << (unsigned int)(1 << 1 )等。然后我将在树结构中并行对数组中的值进行或运算(见图)。

我曾尝试将这个想法放入一些简单的 C++ amp 代码中,但我没有成功,因此我们将不胜感激。

感谢您对此事的考虑,期待回复。

最佳答案

以下代码是我认为您需要的部分代码。这段代码会将一些元素作为输入并在 CPU 上准备 vector ,然后在 GPU 上并行执行位移操作。然后我将 av[elements] 设置回 0,因为我正在使用该元素来存储您的最终结果。这很粗糙,但是 AMP 对于可以在 GPU 上处理的数据类型有很大的限制,所以我只是使用现有数组的一个额外元素。位移完成后,我为按位 OR 函数分别执行另一个并行操作。这也发生在 GPU 上,但不太令人满意,因为每个操作都是对数组的任何给定元素与 av[elements] 元素进行 OR 运算,因此这会造成瓶颈。您的树结构将使这部分运行得更快,但我无法弄清楚如何轻松地完成该部分。实际上,这个程序可以在一台相当老旧的计算机上几秒钟内处理 1 亿个元素。提前为代码中任何违反最佳实践的行为道歉;我也是新手。代码如下:

#include <conio.h>
#include <amp.h>
#include <iostream>

using namespace concurrency;
using namespace std;

unsigned int doParallel(unsigned int);

unsigned int elements;

void main()
{
    int ch=NULL;
    cout<<"\nHow many elements to populate: ";
    cin>>elements;
    cout<<"The result is: "<<doParallel(elements);
    cout<<"\nPress 'X' to exit.";
    do
    {
        ch=_getch();
    } while (ch!='X' && ch!='x');
    exit(0);
}

unsigned int doParallel(unsigned int elements)
{
    vector<unsigned int> v(elements+1);

    for (unsigned int i = 0; i<elements+1;i++)
        {
            v[i]=i;
        }
    array_view<unsigned int,1> av(elements+1,v);

    parallel_for_each(av.extent,[=](index<1> idx)
        restrict(amp)
        {
            av[idx] = static_cast<unsigned int>(av[idx])<<1;
        });
    av[elements]=0;
    parallel_for_each(av.extent,[=](index<1> idx)
    restrict(amp)
    {
        av[elements] |= static_cast<unsigned int>(av[idx]);
    });

    return av[elements];
}

关于c++ - 我如何使用 C++ AMP 并行化以下循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13789152/

相关文章:

c++ - 如何在不导致内存泄漏的情况下使用 QSGGeometryNode 并确保正确清理

c++ - std::remove_if 的渐近复杂度

c++ - WIN32,两个窗口使用相同的 wndproc...为什么?

c# - 在 C# 中创建非托管 C++ 对象

c++ - 函数名称的模板替换

c++ - 在 QtCreator (MinGW) 中编译 SDL2

c++ - 从函数模板类型中提取返回类型

c++ - 主函数中显式模板实例化

c++ - 在 C++11 中有没有一种好方法可以将对其他对象的引用存储为成员?

c++ - 浮点精度未格式化为字符串