Я хочу сделать следующее:Передача указателя функции и ее параметры как тяги :: кортеж глобальной функции
#include <thrust/tuple.h>
#include <tuple>
template<typename... Args>
void someFunction(void (*fp)(Args...), thrust::tuple<Args...> params) {
}
void otherFunction(int n) {
}
int main(int argc, char **argv) {
//// template argument deduction/substitution failed ////
someFunction<int>(&otherFunction, thrust::make_tuple(1));
return 0;
}
То, что я пробовал:
- Удаление один из двух параметр, конечно, приводит к рабочему решению.
- Он работает, когда я делаю
someFunction
статической функцией вstruct
с параметром шаблона. Но в исходном кодеsomeFunction
есть ядро CUDA, поэтому я не могу этого сделать. Какие-нибудь дальнейшие идеи? - Он работает, когда я изменяю тягу :: кортеж в std :: кортеж. Есть ли способ построить трюк :: кортеж из std :: tuple?
EDIT:
Чтобы было понятнее: someFunction
и otherFunction
являются __global__
!
#include <thrust/tuple.h>
#include <tuple>
template<typename... Args>
__global__ void someFunction(void (*fp)(Args...), thrust::tuple<Args...> params) {
}
__global__ void otherFunction(int n) {
}
__constant__ void (*kfp)(int) = &otherFunction;
int testPassMain(int argc, char **argv) {
void (*h_kfp)(int);
cudaMemcpyFromSymbol(&h_kfp, kfp, sizeof(void *), 0, cudaMemcpyDeviceToHost);
someFunction<int><<<1,1>>>(h_kfp, thrust::make_tuple(1));
return 0;
}
Я получаю ошибку компиляции: в обоих примерах template argument deduction/substitution failed
.
* Возможно * не связанный с вашей проблемой, но tou может взять намек примерно на [все стандартные функции алгоритма] (http://en.cppreference.com/w/cpp/algorithm), которые принимают «предикат» как аргумент. Они действительно не заботятся о аргументах функции, у них просто есть один аргумент шаблона 'typename' для этой функции. –
Если 'someFunction' является ядром CUDA (т. Е. Функцией' __global__'), почему вы не настроили его в своем примере (при запуске) или не украсили его соответствующим образом? На мой взгляд, этот вопрос довольно неясен. Является ли 'otherFunction' называться вызываемой функцией' __global__'?Если да, то почему вы не украсили его соответственно? Вы не можете взять адрес функции устройства в код хоста, который, кажется, является тем, что вы здесь делаете (даже если вы украсили 'otherFunction' с' __device__', он все равно не будет работать так, как написано) –
Вопрос не в том, что вызывая ядра из указателей функций ядра. Я оставляю эту часть, потому что она работает. Речь идет о ошибке компилятора при передаче двух аргументов с переменными шаблонами для глобальной функции. – martin