标签: tbb

Levenshtein 算法并行

我已经使用parallel_for 实现了该算法。但大多数情况下我使用同步部分,所以我没有利润。也许有更好的选择?

    tbb::parallel_for (tbb::blocked_range<int>(1, m * n), apply_transform(d, j, this, m, n));

    void apply_transformation(int * d, int i, int j, int n){
        int elem1 = (*v1)[i];
        int elem2 = (*v2)[j];
        if(elem1 == elem2){
            dLock.acquire(dMutex);
            d[i*n + j] = d[(i-1)*n + j-1];       // no operation required
            dLock.release();
        } else {
            dLock.acquire(dMutex);
            d[i*n + j] = std::min(std::min(d[(i-1)*n + j] + 1, //deletion
                    d[i*n + j-1] + 1), //insertion
                    d[(i-1)*n + j-1] + 1); //substitution
            dLock.release();
        }
    }

    class apply_transform{
        int * array; …
Run Code Online (Sandbox Code Playgroud)

parallel-processing tbb levenshtein-distance

0
推荐指数
1
解决办法
1361
查看次数

我无法理解来自tbb的parallel_for

#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for.h>
#include <random>

#define N 1000000

int main()
{
    tbb::concurrent_vector<u_int32_t> v(N);

    std::mt19937 mt;
    std::uniform_int_distribution<u_int32_t> dist(0,499);

    tbb::parallel_for( tbb::blocked_range<tbb::concurrent_vector<u_int32_t>>(v.begin(),v.end()),[&]{return dist(mt);});

    return(0);

}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不起作用,据我了解,此接口parallel_for应包括容器的起点、终点以及应在循环的每次迭代中执行的步骤的大小,最后一次参数是将要执行的函数。

现在tbb::blocked_range它用于分割容器(对吗?),所以在这种情况下它应该很有用,我无法让它工作,而且我不明白为什么这不能以更简单的方式与迭代器一起工作。 ..

c++ concurrency tbb

0
推荐指数
1
解决办法
2168
查看次数

英特尔 TBB 比 std 慢 2 倍 - tbb 与 std

我对两个用来自梅森扭曲器的伪随机整数填充给定向量的程序进行了一些比较,重点是 TBB 版本非常慢,当 TBB 需要时,std 版本在大约 0.6 秒内执行任务至少1.1秒。

我还注意到 TBB 并没有真正提供优化的算法来处理容器,但它只提供通用构造(parallel_for、parallel_for_each 和类似的)来处理通用任务,其中 std 提供的在这种情况下std::generate是一个更好、更干净的解决方案。

你可以在这里下载我的小测试,其中包含 2 个小源文件 + gcc 的 Makefile http://www.sendspace.com/file/ew73h8

我在这里做错了什么?我增加这个向量的大小越多,TBB 就越慢,我使用的是 Ubuntu 13.04 64 位和 Intel Q6600。

TBB 版本在某些方面可以做得更好吗?

编辑:这两个文件的完整源代码


配置文件

#define N 10000000
Run Code Online (Sandbox Code Playgroud)

标准cpp

#include <random>
#include <iostream>
#include <vector>
#include <algorithm>

#include "config.hpp"

int main() {

    std::vector<u_int32_t> v(N);

    std::mt19937 mt;
    std::uniform_int_distribution<u_int32_t> dist(0,499);

    std::generate(v.begin(),v.end(),[&]{return dist(mt);});

    return(0);
}
Run Code Online (Sandbox Code Playgroud)

待定.cpp

#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for_each.h>

#include <random>
#include <iostream>

#include "config.hpp"

int main()
{
  tbb::concurrent_vector<u_int32_t> v(N);
  std::mt19937 …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency vector tbb c++11

0
推荐指数
1
解决办法
4866
查看次数

并行返回错误结果的parallel_reduce

我正在尝试使用英特尔TBB parallel_reduce来获取由双精度组成的数组元素的总和.但是,与OpenMP减少实现相比,结果是不同的.

这是OpenMP的一个:

double dAverageTemp = 0.0;
#pragma omp parallel for reduction(+:dAverageTemp)
for (int i = 0; i < sCartesianSize; i++)
    dAverageTemp += pdTempCurr[i];
Run Code Online (Sandbox Code Playgroud)

此代码返回正确的值"317.277 493 "; 但是这个TBB代码:

double dAverageTemp = tbb::parallel_reduce(tbb::blocked_range<double*>(pdTempCurr, pdTempCurr + sCartesianSize - 1),
                                        0.0,
                                        [](const tbb::blocked_range<double*> &r, double value) -> double {
                                            return std::accumulate(r.begin(), r.end(), value);
                                        },
                                        std::plus<double>()
                                        );
Run Code Online (Sandbox Code Playgroud)

坚持认为结果是"317.277 193 ".

我在这里错过了什么?

c++ parallel-processing tbb openmp

0
推荐指数
1
解决办法
79
查看次数

TBB parallel_for 编译错误

我想使用 TBB parallel_for 我在我的代码中进行了测试

#include <tbb/parallel_for.h>
#include <tbb/blocked_range.h>
#include <tbb/tbb.h>

std::vector<std::tuple<std::string, unsigned int, std::string>> commands;
auto n = commands.size();
tbb::parallel_for(0, n, [&](int i) {
    const auto &tuple = commands[i];
} );
Run Code Online (Sandbox Code Playgroud)

我的编译行是:

g++ -std=c++11 -Wall -Wextra -g -Og TextMiningApp.cpp -ltbb -o TextMiningApp
Run Code Online (Sandbox Code Playgroud)

我的编译器错误是:

TextMiningApp.cpp: In function ‘int main(int, char**)’:
TextMiningApp.cpp:184:7: error: no matching function for call to ‘parallel_for(int, long unsigned int&, main(int, char**)::<lambda(int)>)’
     } );
       ^
In file included from TextMiningApp.cpp:15:0:
/usr/include/tbb/parallel_for.h:185:6: note: candidate: template<class Range, class Body> void tbb::parallel_for(const …
Run Code Online (Sandbox Code Playgroud)

c++ templates tbb c++11

0
推荐指数
1
解决办法
1337
查看次数

如何在任务组中等待Intel TBB中的单个任务并杀死其他任务?

在英特尔 TBB 中,我尝试: 1. 创建一组任务 2. 让它们运行 3. 当其中一个任务完成时,我从中得到一些结果并杀死其他任务。

我怎样才能做到这一点 ?我只能看到 API 等待所有而不仅仅是单个......

谢谢。

c++ intel tbb task wait

0
推荐指数
1
解决办法
1353
查看次数

原子变量从一个函数中多次访问

我有以下代码:

标题:

class Counter
{
public:
    Conuter(const std::string& fileName);
    boost::uint16_t getCounter();
private:
    tbb::atomic<boost::uint32_t> counter;
    std::string counterFileName;
};
Run Code Online (Sandbox Code Playgroud)

cpp:

Counter::Counter(const std::string& fileName) : counter(), counterFileName(fileName)
{  
    std::string line;
    std::ifstream counterFile (fileName.c_str());  
    if (counterFile.is_open())
    {
        getline (counterFile, line);
        counterFile.close();
    }

    boost::uint32_t temp = std::stoul (line,nullptr,0);
    counter = temp;
}

boost::uint32_t Counter::getCounter()
{
    if (counter > 1000)
    {
        counter = 0;
    }

    assert( counter < 1000);

    const boost::uint32_t ret = counter++;

    if ((counter % 10) == 0)
    {
        // write the counter back …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost tbb

-2
推荐指数
1
解决办法
63
查看次数