Как использовать функции boost.compute в функторе, который будет использоваться Thrust на графическом процессоре? - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь использовать специальную функцию, предоставленную boost.math в алгоритме тяги.

По сути, я хочу сделать преобразование, например,

  thrust::device_vector<double> in(1000);
  thrust::device_vector<double> out(1000);

  thrust::transform(in.begin(), in.end(), out.begin(), myfunctor());

где myfunctor() задается

#include <boost/math/special_functions/ellint_1.hpp>
.
.
.
struct myfunctor {
  __host__ __device__
  double operator()(double k) {
    return boost::math::ellint_1(sqrt(k));
  }
};

Я продолжаю получать warning: calling a __host__ function from a __host__ __device__ function is not allowed прямо в строке, где в функторе вызывается ellint_1.

Я делаю что-то не так или Boost.mathне подходит для использования GPGPU (потому что из того, что я прочитал, я определенно думал, что это было)?

1 Ответ

0 голосов
/ 02 июня 2019

Любая функция, вызываемая внутри __device__ квалифицированных функций, также должна быть __device__ квалифицированной функцией.И boost::math::ellint_1() не имеет такого квалификатора.

См. Руководство по программированию CUDA B.1.- Спецификаторы пространства выполнения функций https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#function-declaration-specifiers

И boost :: math не имеет отношения к boost :: compute, причем последний фокусируется на общих STL-подобных алгоритмах и контейнерах.

...