に私は、次の操作を実行したい:関数ポインタと推力としてそのパラメータを渡す::タプルをグローバル関数
私が試してみました何#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カーネルなので、私はそれを行うことはできません。その他のアイデアは?- 私はthrust :: tupleをstd :: tupleに変更すると動作します。 std :: tupleからthrust :: 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__'関数から呼び出し可能になっていますか?もしそうなら、あなたはそれに応じてそれを飾っていないのですか?あなたはここで何をしているかのように見えるホストコード内のデバイス関数のアドレスを取ることはできません( '__device__'で' otherFunction'を装飾しても、まだ書かれているようには機能しません) –
質問はカーネル関数ポインタからカーネルを呼び出す。それが動作するので、私はこの部分を残します。これは、可変長テンプレートを持つ2つの引数をグローバル関数に渡すときのコンパイラエラーに関するものです。 – martin