boost :: compute, передавая указатель на замыкание - PullRequest
0 голосов
/ 11 февраля 2019

Добрый вечер!Я пишу высокопроизводительное приложение и пытаюсь использовать boost для ускорения сложных вычислений.

Суть моего вопроса: есть ли способ передать внешний указатель на массив (например, float4_ *) наBOOST_COMPUTE_CLOSURE?Я хотел бы получить что-то вроде:

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

1 Ответ

0 голосов
/ 12 февраля 2019

Хорошо, я наконец-то узнал, как реализовать заявленные параметры.Первое, что нужно сделать, это передать boost::compute::detail::device_ptr<float4_> экземпляр функции.Далее мы должны объявить генератор typename для `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;
            }
        }
    }
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...