2017-12-04 14 views
1

私はCudaコードでグリッドとブロックサイズの選択を自動化しようとしています。私の場合、必要な共有メモリの量はスレッドの数によって異なります。この関数の構文は次のとおりです。cudaOccupancyMaxPotentialBlockSizeVariableSMem単項関数

__host__ ​cudaError_t cudaOccupancyMaxPotentialBlockSizeVariableSMem (int* minGridSize, int* blockSize, T func, UnaryFunction blockSizeToDynamicSMemSize, int blockSizeLimit = 0) 

次のように単項関数を定義しようとしました。

struct unaryfn: std::unary_function<int, int> { 
    int operator()(int i) const { return 12* i; } 

}; 

次に、CUDA API関数を次のように呼び出します。私はコンパイルするとき

int blockSize; // The launch configurator returned block size 
    int minGridSize; // The minimum grid size needed to achieve the 
    // maximum occupancy for a full device launch 
    int gridSize; // The actual grid size needed, based on input size 
    unaryfn::argument_type blk; 
    unaryfn::result_type result; 
    unaryfn ufn; 
    cudaOccupancyMaxPotentialBlockSizeVariableSMem(&minGridSize, &blockSize, 
                CUDAExclVolRepulsionenergy, ufn(), 0); 
    std::cout<<(nint +blockSize -1)/blockSize<<" "<<blockSize<<endl; 

、私はエラーが解決しよう

error: function "unaryfn::operator()" cannot be called with the given argument list object type is: unaryfn How do I fix this issue?

+0

解決済み!関数呼び出しの単項関数上の括弧を削除すると助けになりました。 cudaOccupancyMaxPotentialBlockSizeVariableSMem(&minGridSize、&blockSize、 CUDAExclVolRepulsionenergy、ufn()、0); –

+0

解決策を回答として追加してください – talonmies

答えて

0

を入手します!関数呼び出しの単項関数上の括弧を削除すると助けになりました。 cudaOccupancyMaxPotentialBlockSizeVariableSMem(& minGridSize、& blockSize、CUDAExclVolRepulsionenergy、ufn()、0);