boost::compute,将指针传递给闭包



晚上好!我正在编写一个高性能应用程序,并尝试使用 boost 来加速复杂的计算。

我问题的本质:有没有办法将指向数组(如float4_ *(的外部指针传递给BOOST_COMPUTE_CLOSURE?我想得到这样的东西:

float4_ *normals = new float4_[NORMALS_NO];
BOOST_COMPUTE_CLOSURE(void, evalNormals, (int4_ indices), (normals), {
    ...
});

好的,我终于找到了如何实现声明的选项。首先要做的是boost::compute::detail::device_ptr<float4_>实例传递给函数。接下来,我们应该为"OpenCL 后端"声明一个类型生成器,并operator<<将指针信息写入meta_kernel实例中,该实例在闭包定义中以隐藏方式使用。因此,代码:

1( 传递device_ptr实例

...
#include <boost/compute/detail/device_ptr.hpp>
...
float4_ *normalsData = new float4_[NORMALS_NO];
device_ptr<float4_> normalsDataDP = normalsData;
...
BOOST_COMPUTE_CLOSURE(void, evalNormals, (int4_ indices), (normalsDataDP), {
    ...
});
...

2( 实现字体生成器:

...
namespace boost {
    namespace compute {
        template<>
        inline const char *type_name<detail::device_ptr<float4_>>()
        {
            return "__global float4 *";
        }
    }
}
...

3( 实施operator<<

...
namespace boost {
    namespace compute {
        namespace detail {
            meta_kernel &operator<<(meta_kernel &kern, 
                                    const device_ptr<float4_> &ptr)
            {
                std::string nodes_info = kern.get_buffer_identifier<float4_>(ptr.get_buffer());
                kern << kern.var<float4_ *>(nodes_info);
                return kern;
            }
        }
    }
}
...

BOOST_COMPUTE_CLOSURE的文档略显稀疏,正如库作者在这里所报告的那样,但一些测试用例显示了如何捕获vector s和 array s。它实际上是透明的,与标量相同。

例如,捕获vec

int data[] = {6, 7, 8, 9};
compute::vector<int> vec(data, data + 4, queue);
BOOST_COMPUTE_CLOSURE(int, get_vec, (int i), (vec), { return vec[i]; });
// run using a counting iterator to copy from vec to output
compute::vector<int> output(4, context);
compute::transform(
    compute::make_counting_iterator(0),
    compute::make_counting_iterator(4),
    output.begin(),
    get_vec,
    queue);
CHECK_RANGE_EQUAL(int, 4, output, (6, 7, 8, 9));

最新更新