3

Intel の Thread Building Blocks ライブラリがややこしいと思います。たとえば、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;
}

operator()TBBでそれを行うには、クラスでを使用する必要があることを理解しています。本当?これを理解するためにTBBの「初心者向けチュートリアル」を読みたかったのですが、初心者用チュートリアルはないようです。

少なくともこの計算に TBB を適用するのを手伝ってくれませんか?

4

1 に答える 1

7

TBB には、開始するのに非常に役立つヘルプ リファレンス ドキュメントがあります。ドキュメントforを使用parallel_forすると、サンプルを parallel_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;
}
于 2012-11-19T04:23:44.327 に答える