我有一个非常适合并行处理的经常调用的函数,因此我研究了入门的C++放大器。该函数接受三个输入:浮点数的 vector ,是输入数据一个常数系数的 vector ,在整个调用过程中保持不变一个输出 vector ,将结果写入其中。 现在显然,每次调用都必须将#1复制到GPU上。为此,我使用了堆栈管理的const array ,效果很好。对于#2,最佳情况是将 vector 以某种方式保留在GPU内存中,因为它是恒定的。使用放大器可以吗?还是我每次调用parallel_for_each都必须复制它,类似于#1?对于#3,是否可以在GPU上分配缓冲区并复制回去,而不是在cpu堆栈上创建空缓冲区,然后复制并在将结果写入后再复制回去?最后一件事,因为parallel_for_each调用本质上是异步的-并且将被#3的析构函数或array_view::synchronize()同步,是否有可能离开当前函数(和堆栈空间),同时做一些其他事情GPU正在处理,然后在以后“同步”吗?它将需要动态分配的array_view以避免销毁sync(),但是当我使用指针而不是堆栈管理的对象时,该函数似乎无法编译:error C3581: unsupported type in amp restricted codepointer or reference is not allowed as pointed to type, array element type or data member type (except reference to concurrency::array/texture)另外,对于那些在其他建筑技术(例如OpenCL)中有丰富经验的人,我在那会更好吗? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 1-是。如果传递const array_view作为输入,则不会将其复制回主机内存。std::vector<float> cpu_data(20000000, 0.0f);array_view<const float, 1> cpu_data_view(cpu_data.size(), cpu_data); 2-取决于系数数组的大小,您可以执行以下几项操作之一: a-将其存储在parallel_for_each lambda中的本地数组中。这很方便,但是会用完(宝贵的)本地内存,因此只有在数组很小的情况下才是现实的。array<float, 1> gpu_data(400);std::vector<float> cpu_data(gpu_data.extent.size(), 1.0f);copy(cpu_data.begin(), gpu_data);在这种情况下,只要lambda捕获到gpu_data,它将对所有AMP代码可用。 b-创建array并在执行任何AMP代码之前将常量数据显式复制到其中。 c-如果每个线程多次访问它,请考虑将其加载到tile_static内存中。 3-您仍然可以使用array_view来保存输出数据,但是在执行discard_data之前在其上调用parallel_for_each将防止不必要的复制到GPU内存。std::vector<float> cpu_output_data(20000000, 0.0f);array_view<float, 1> output_data_view(cpu_output_data.size(), cpu_output_data);output_data_view.discard_data();**异步-**是的,完全可以做到这一点。您可以将AMP与C++ future 和异步操作结合使用,以同时在CPU(或另一个GPU)上执行其他工作。请记住,CPU参与控制GPU上的工作计划以及将数据移入或移出GPU的工作。因此,如果您使CPU过载,则GPU性能可能会受到影响。对您的编译器错误进行WRT,很难在不看代码的情况下分辨出问题所在。完全可以执行以下操作:std::unique_ptr<concurrency::array_view<int, 2>> data_view;您可能想看看examples covered in the C++ AMP book。它们在CodePlex上可用,并且涵盖了许多此类情况。 (adsbygoogle = window.adsbygoogle || []).push({});
09-10 04:38
查看更多