gpt4 book ai didi

c++ - token 的 Tbb 并行管道就地修改

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:26 25 4
gpt4 key购买 nike

我想使用 tbb 管道来并行处理 token 。

但我不需要在中间过滤器期间取消分配和重新分配 token 。简单地就地修改它并返回它可以吗?例如我想做的:

class MiddleFilter
{
SomeClass* operator() (SomeClass* input)
{
input->somevalue *= 2;
return input;
}
}

并调用

tbb::parallel_pipeline(nbtoken, someinputfilter 
& tbb::make_filter<SomeClass*, SomeClass*>(tbb::filter::parallel, MiddleFilter())
& someoutputfilter)

SomeClass 将在输入和输出过滤器中分配和释放。

最佳答案

是的,允许对传递给过滤器的对象进行就地修改,并且在处理复制成本很高的对象时经常有用。我在使用 parallel_pipeline 并行化 Bzip2 时已经这样做了。就 TBB 而言,您示例中的指针“输入”只是 TBB 不尝试解释的值。

我有时会使用另一个技巧来保存第一个/最后一个过滤器中的分配/释放。如果第一个和最后一个过滤器是串行过滤器,并且第一个过滤器产生的对象与最后一个过滤器消耗的类型相同,那么可以使用循环对象队列来回收对象。缓冲区的大小必须为 max_number_of_live_tokens(parallel_pipeline 的第一个参数)。第一个过滤器可以通过出队分配一个对象;最后一个阶段可以通过入队来释放一个对象。从 max_number_of_live_tokens 队列开始。 token 限制保证队列永远不会下溢或溢出。

简洁的部分是循环队列可以使用简单的串行代码实现。尾部/头部的数组和两个指针就足够了。不需要原子操作、锁定或内存栅栏。没有下溢/溢出的保证意味着入队操作可以通过仅碰撞尾指针(并幸福地忽略头指针)来实现。双端队列操作反之亦然。不需要锁定,因为调用者是串行过滤器。更糟糕的是,尾指针和头指针同时碰撞,但是是独立的。 TBB 将负责内存防护。

关于c++ - token 的 Tbb 并行管道就地修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15147204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com