我正在尝试在我的Cuda代码中自动选择网格和块大小。在我的例子中,所需的共享内存量取决于线程数。该函数具有以下语法。
__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;
编译时,我收到错误
错误:无法使用给定的参数列表调用函数“unaryfn :: operator()” 对象类型是:unaryfn 我该如何解决这个问题?
答案 0 :(得分:0)
解决!删除函数调用中的一元函数的括号有帮助。 cudaOccupancyMaxPotentialBlockSizeVariableSMem(&amp; minGridSize,&amp; blockSize,CUDAExclVolRepulsionenergy,ufn(),0);