簡體   English   中英

boost::compute,傳遞指向閉包的指針

[英]boost::compute, passing pointer to a closure

晚上好! 我正在編寫一個高性能應用程序並嘗試使用 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 backend` 和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的文檔如庫作者在此處報告的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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM