Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TBB并行化我的代码的教程/文档?_C++_Multithreading_Loops_Tbb - Fatal编程技术网

C++ TBB并行化我的代码的教程/文档?

C++ TBB并行化我的代码的教程/文档?,c++,multithreading,loops,tbb,C++,Multithreading,Loops,Tbb,我发现英特尔的线程构建块库有点令人困惑。例如,我想使用TBB并行化以下计算: int CountNegatives(std::vector<Trigraph> input) { int count = 0; for(int i = 0; i< input.size(); i++) { if(input[i].VisibleFrom(viewPoint)) { count++; }

我发现英特尔的线程构建块库有点令人困惑。例如,我想使用TBB并行化以下计算:

int CountNegatives(std::vector<Trigraph> input)
{
    int count = 0;
    for(int i = 0; i< input.size(); i++)
    {
        if(input[i].VisibleFrom(viewPoint))
        {
            count++;
        }
    }
    return count;
}
int CountNegatives(标准::矢量输入)
{
整数计数=0;
对于(int i=0;i
我知道您必须在TBB中对类使用
操作符()
;这是真的吗?我本想读一些关于TBB的“初学者教程”来帮助我解决这个问题,但似乎没有任何初学者教程

你能帮我把TBB至少应用到这个计算中吗?

TBB有一个非常有用的方法,可以开始使用。使用for
parallel\u for
,将示例转换为使用parallel\u for非常简单。下面是一些示例代码。虽然不是100%,但你可以理解。上面的链接还包含一些更有趣功能的示例

#include <tbb/parallel_for.h>
#include <tbb/atomic.h>
#include <iostream>
#include <vector>

/** 
 * To be used with tbb::parallel_for, this increments count
 * if the value at the supplied index is zero.
 */
class ZeroCounter
{
public:
    ZeroCounter(std::vector<int> * vec, tbb::atomic<int> * count) :
        vec(vec),
        count(count)
    { } 

    void operator()(int index) const
    {
        if((*vec)[index] == 0)
            ++(*count);
    }

    std::vector<int> * vec;
    tbb::atomic<int> * count;
};

int main()
{
    // Create a vector and fill it with sample values
    std::vector<int> a;
    a.push_back(0);
    a.push_back(3);
    a.push_back(0);

    // Counter to track the number of zeroes
    tbb::atomic<int> count;
    count = 0;

    // Create our function object and execute the parallel_for
    ZeroCounter counter(&a, &count);
    tbb::parallel_for(size_t(0), a.size(), counter);

    std::cout << count << std::endl;
}
#包括
#包括
#包括
#包括
/** 
*要与tbb::parallel_一起使用,此递增计数
*如果提供的索引处的值为零。
*/
类零计数器
{
公众:
零计数器(标准::向量*向量,tbb::原子*计数):
vec(vec),,
计数(计数)
{ } 
void运算符()(int索引)常量
{
如果((*vec)[索引]==0)
++(*计数);
}
std::vector*vec;
tbb::原子*计数;
};
int main()
{
//创建一个向量并用样本值填充它
std::载体a;
a、 推回(0);
a、 推回(3);
a、 推回(0);
//计数器以跟踪零的数量
tbb::原子计数;
计数=0;
//创建我们的函数对象并执行
零计数器计数器(&a,&count);
tbb::并行(大小为(0),a.size(),计数器);

std::cout告诉我们你做了什么,你在哪里做了什么。另外:计算向量中的位是位旋转黑客的事情,真的。不是循环。std::vector大多数时候是反模式。使用
std::bitset
,如果你可以使用bools作为例子,实际上我正在尝试执行视图截头体剔除检查,但对于很多事情,我也可以使用多线程功能。我只需要一些关于并行_使用的基本指导:(好的,我只是编辑了代码,以明确操作不是琐碎的。(我在那里编了一些术语,因为我不做3D编程…).也别忘了告诉我们你试过什么,你在哪里stuck@sehe:我编辑了none的问题,将重点放在他/她的特定代码上-这符合(单一)投票的答案。我同意doc很有用,但它也很糟糕。就像大多数英特尔文档一样。