gpt4 book ai didi

c++ - 在 C++Amp 中使用指针

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:12 25 4
gpt4 key购买 nike

我有以下问题:

我有一个代码可以执行非常基本的操作。我正在传递一个指向 concurrency::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 的参数只能按值传递。这就是为什么我仍在寻找一种方法来在初始化类或将一些参数(即图像数据)传递给类时将值从 CPU 复制到 GPU。

最佳答案

您的 C++ AMP 问题

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

An array represents data on an accelerator. You can construct it andfill it with data in a single step or construct it and fill it withdata later. In either case, after some calculations have beenperformed on it, you will almost certainly copy the results from anarray back to the CPU so that you can use them in some other part ofyour application.

You can certainly write useful applications using only arrays,but C++ AMP also offers the array_view, which supports featuresthat often make it more convenient than working directly with arrays.An array_view looks like an array to the accelerator, but it saves youthe trouble of arranging to copy the data to and from theaccelerator.

The relationship between an array_view and an array issomewhat (but not precisely) like that between a reference and theobject it refers to. Like a reference, array views must be initializedwhen they are created. Also as with a reference, changing thearray_view changes (eventually) the data it was created from. However,the reverse is not true: changing the data from which thearray_view was created might not automatically change the array_view,so you should approach such operations with care.

发件人:C++ AMP: Accelerated Massive Parallelism

我不认为你使用 pixels本身就是问题。您不能在 C++ AMP lambda 期间使用全局范围的变量。没有办法解决这个问题。 C++ AMP 代码在具有不同内存空间的设备上执行。

但是您可以初始化您的 arrayarray_view早先在单独的方法或构造函数中创建对象,然后将它们传递给完成所有工作的函数。下面的代码按照这些思路做了一些事情。 m_frames是指向 (C++ AMP) array 的指针数组声明为类的一部分然后在 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));
}

您的最小/最大 header 问题

这可能是因为您包含了 windef.h 或依赖它的东西。这是混合 STL 和 Windows header 时的一个已知问题。 “修复”它的方法是定义 NOMINMAX在文件的顶部,在任何其他包含之前,然后使用 STL 或 AMP 声明的最小/最大函数(它还定义了用于 restrict(amp) lambda 的最小/最大函数)。

#define NOMINMAX

如果您使用的是 GDI,您也会遇到问题,因为它需要 Windows MIN/MAX 宏。

我将 GIDPlus.h 包装在包含以下内容的包装器 header 中:

#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

关于c++ - 在 C++Amp 中使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20936445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com