ich folgendes zu tun:Passing einen Funktionszeiger und seine Parameter als Schub :: tuple zu einer globalen Funktion
#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;
}
Was habe ich versucht:
- Entfernen eines der beiden Parameter führt zu einer funktionierenden Lösung natürlich.
- Es funktioniert, wenn ich
someFunction
eine statische Funktion in einemstruct
mit Vorlage Parameter machen. Aber im ursprünglichen CodesomeFunction
ist ein CUDA-Kernel, also kann ich das nicht tun. Irgendwelche weiteren Ideen? - Es funktioniert, wenn ich schub :: tuple zu std :: tuple ändere. Gibt es eine Möglichkeit, ein stuck :: tuple aus einem std :: tuple zu konstruieren?
EDIT:
es deutlicher zu machen: someFunction
und otherFunction
sind __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;
}
ich einen Compiler-Fehler: template argument deduction/substitution failed
in beiden Beispielen.
* Vielleicht * nicht verwandt mit Ihrem Problem, aber tou könnte einen Hinweis von nur [alle Standard-Algorithmus-Funktionen] (http://en.cppreference.com/w/cpp/algorithm) nehmen, die ein "Prädikat" als nehmen Streit. Sie interessieren sich nicht wirklich für die Argumente für die Funktion, sie haben nur ein einziges 'type'-Template-Argument für die Funktion. –
Wenn 'someFunction' ein CUDA-Kernel ist (d. H. Eine' __global__' -Funktion), warum haben Sie es nicht in Ihrem Beispiel konfiguriert (beim Start) oder entsprechend dekoriert? Aus meiner Sicht ist diese Frage ziemlich unklar. Soll 'otherFunction' von einer' __global__' Funktion aufgerufen werden?Wenn ja, warum hast du es nicht entsprechend dekoriert? Sie können nicht die Adresse einer Gerätefunktion im Host-Code nehmen, was scheinbar das ist, was Sie hier tun (selbst wenn Sie 'otherFunction' mit' __device__' dekoriert haben, funktioniert es immer noch nicht wie geschrieben) –
Die Frage geht nicht um Aufruf von Kernels von Kernelfunktionszeigern. Ich verlasse diesen Teil, weil es funktioniert. Es geht um einen Compilerfehler, wenn zwei Argumente mit variadischen Vorlagen an eine globale Funktion übergeben werden. – martin