推力如何确定要传递给函子的参数

How does thrust determine arguments to pass to functor

我的问题是:

1: Thrust 如何确定将哪些参数发送给函子以及以何种顺序发送它们? 是在输入迭代器数据的顺序?我还没有找到这方面的任何信息。 我看过例如的例子zip/tuple 迭代器的推力转换用法,它有两种数据类型,例如在这个问题中:,但基本上不会有超过 2 个 operator() 参数。 更新:我想我可以在这里使用带有所需数据的结构对象,并使用带有结构对象的设备向量迭代器的 1 参数 operator()..

2: 是否允许传递给仿函数 operator() 以用于推力函数的参数的最大数量?

3: 在特殊情况下,除了其他参数外,还想将 CUDA 内核线程 ID 传递给仿函数 operator(),如何实现?下面未完成示例中的伪代码是否可能? 如果可以,您能帮我解决一下吗? (如果你想要 n 个推力函子 operator() 的参数,最好是一个通用的解决方案):

#include <thrust/device_vector.h>

struct functor
{
    __device__ operator()(unsigned int thread_id, int arg2, double arg3, float arg4) // n arguments of different types in general, this is just an example
    {
        // Do some operations here..
    }
};

int main()
{ 
    // How to zip multiple device vector iterators here such 
    // that one can match the given functor argument list for operator()?
    // and thus use the functor. 

   
    return 0;
}

How does Thrust determine what arguments to send to a functor and in which order to send them? Is it in the order of the input iterator data? I have not found any information on this

没有关于它的任何信息,因为推力中并行算法的操作顺序未定义。

Is there a max number of arguments allowed to pass to the functor operator() for use in a thrust function?

是的。仿函数本身通常必须是一元、二元或三元函数的模型。算法本身为谓词和运算符定义了可接受的仿函数的形式。这本身不是问题,因为您有可以通过的容器。我记得,thrust::tuple 具有最多 10 个成员的静态模板特化。

In special cases where you want to pass the CUDA kernel thread ID to the functor operator(), in addition to other arguments, how can this be done? Is the pseudocode in the unfinished example below even possible?

永远,永远,永远不要那样做。它不会工作。如果您需要用于计算的唯一顺序标识符,请使用花哨的迭代器,如计数迭代器。通过 zip 运算符将其传递给您的函子。