在C ++中放大器使用指针(Using pointers in C++Amp)

2019-10-19 04:45发布

我有以下问题:

我有一个做了非常基本的操作的代码。 我传递一个指向并发::的array_view因为我想存储值早些时候,以避免在使用多线程功能的瓶颈。 问题是下面的结构不会编译:

parallel_for_each((*pixels).extent, [=](concurrency::index<2> idx) restrict(amp)
{
int row=idx[0];
int col=idx[1]; 

    (*pixels)(row, col) = (*pixels)(row, col) * (*taps)(row, col); //this is the problematic place 
});

有谁知道如何解决这个情况? 我真的需要运行的方法所以这是不喜欢这样,因为我不能对复制的RAM和加速器的内存之间的数据花费时间的唯一方法之前准备数据。

//编辑:

解决与头文件的一些问题之后,我留下了以下问题:

parallel_for_each((*pixels).extent, [=](concurrency::index<2> idx) restrict(amp)
{
int row=idx[0];
int col=idx[1]; 
});

上面的代码不工作(它给除外)。 有没有准备数据更早因此,例如类的构造函数可以处理复制它只是一个时间什么办法? 我真的需要有一个指针在我的头文件中的array_view并在构造函数初始化它,如下所示:

在cci_subset.h:

concurrency::array_view<float, 2> *pixels, *taps; 

而在subset.cpp:

concurrency::array_view<float, 2> pixels(4, 4, pixel_array); 
... 
concurrency::array_view<float, 2> taps(4, 4, myTap4Kernel_array); 

//编辑2:

我发现,对于parallel_for_each的参数可以通过数值来唯一通过。 这就是为什么我仍然在寻找一种方式来intializing类或传递一些参数(即图像数据)到上课的时候从值CPU拷贝到GPU。

Answer 1:

你的C ++ AMP问题

C ++ AMP支持在GPU上引用数据的两个核心数据类型

数组表示加速器数据。 您可以构建它,在一个单一的步骤有数据填充或构建它,后来用数据填充它。 在这两种情况下,经过一番计算,已对其执行的,你几乎肯定会的结果从一个数组复制回CPU,这样就可以在应用程序的其它部分使用它们。

你可以只使用数组肯定写有用的应用程序,但C ++ AMP还提供的array_view,它支持的功能,往往使其比直接使用数组更加方便。 对于一个array_view看起来像一个阵列加速器,但它可以节省你安排将数据复制到和从加速器的麻烦。

一个的array_view和阵列之间的关系是一定程度上(但不是精确地)那样的参考和对象之间它是指。 像的参考,在创建时阵列的观点必须初始化。 还可以作为与参考,改变的array_view变化(最终)它是从创建的数据。 然而,反之则不然:改变从其中的array_view创建可能不会自动更改的array_view中的数据,所以你应该接近这样的操作要小心。

来自: C ++ AMP:加速大规模并行

我不认为你的使用pixels为每本身的问题。 你不能在全球使用C ++ AMP拉姆达内范围的变量。 有没有办法解决这个。 在C ++代码AMP与不同的存储器空间中的装置上执行。

但是,您可以初始化arrayarray_view更早对象在一个单独的方法或构造函数,然后将它们传递给所有的工作的功能。 下面的代码做东西沿着这些路线。 m_frames是一个指针数组,以(C ++ AMP) array被声明为类的PARE然后在初始化的对象ConfigureFrameBuffers

注意,它使用STL智能指针,这是我会强烈建议在原始指针。

class FrameProcessorAmpBase
{
private:
    std::shared_ptr<array<float, 2> m_frame;

public:
    FrameProcessorAmpBase()
    {
    }

void ConfigureFrameBuffers(int width, int height)
{
    m_frame = std::make_shared<array<float, 2>>(height, width)); 
}

您的最小/最大头的问题

这可能是因为你是包括WINDEF.H,或者一些需要和它有关联。 这是一个已知的问题混合STL和Windows头时。 “修复”的方式是定义NOMINMAX在您的文件的顶部之前的任何其他包括,然后使用通过STL或AMP声明的最小值/最大值的函数(也限定最小/最大用于restrict(amp)的lambda) 。

#define NOMINMAX

如果你正在使用GDI你就会有问题,有太多,因为它需要Windows MIN / MAX宏。

我在这包含以下的包装头包GIDPlus.h:

#pragma once

#define NOMINMAX
#include <algorithm>
#ifndef max
    #define min std::min
#endif
#ifndef min
    #define max std::max
#endif
#include <gdiplus.h>
#undef max 
#undef min 


文章来源: Using pointers in C++Amp