1

TBB (Threading Building Blocks) を使用して R パッケージをコンパイルしたい。インターネットの簡単な例を使用して、TBB で R パッケージを開発できるかどうかをテストしました。

gcc のこれらのフラグを含む Makevars ファイルを作成します。

PKG_CPPFLAGS=-I/opt/tbb41_20121003oss/include/ -O3 -g3 -Wall -c -fmessage-length=0
PKG_LIBS=-L/opt/tbb41_20121003oss/build/linux_intel64_gcc_cc4.4.6_libc2.12_kernel2.6.32_release/ 

ソースコードは次のとおりです。

#include <iostream>
#include <string>
#include <algorithm>
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"

using namespace tbb;
using namespace std;
static const size_t N = 23;

class SubStringFinder {
 const string str;
 size_t *max_array;
 size_t *pos_array;
   public:
    void operator() ( const blocked_range<size_t>& r ) const {
    for ( size_t i = r.begin(); i != r.end(); ++i ) {
    size_t max_size = 0, max_pos = 0;
    for (size_t j = 0; j < str.size(); ++j)
    if (j != i) {
    size_t limit = str.size()-max(i,j);
    for (size_t k = 0; k < limit; ++k) {
      if (str[i + k] != str[j + k]) break;
      if (k > max_size) {
        max_size = k;
        max_pos = j;
      }
    }
  }
  max_array[i] = max_size;
  pos_array[i] = max_pos;
 }
 }
 SubStringFinder(string &s, size_t *m, size_t *p) :
  str(s), max_array(m), pos_array(p) { }
};

extern "C" {
int test() {

 string str[N] = { string("a"), string("b") };
 for (size_t i = 2; i < N; ++i) str[i] = str[i-1]+str[i-2];
 string &to_scan = str[N-1];
 size_t num_elem = to_scan.size();

  size_t *max = new size_t[num_elem];
  size_t *pos = new size_t[num_elem];

  parallel_for(blocked_range<size_t>(0, num_elem ),
           SubStringFinder( to_scan, max, pos ) );
   //
  for (size_t i = 0; i < num_elem; ++i)
  cout << " " << max[i] << "(" << pos[i] << ")" << endl;
  delete[] pos;
  delete[] max;

}
}

コードをコンパイルすると、次のエラーが発生します。

 library/2.14/test/libs/test.so: undefined symbol: _ZTIN3tbb4taskE

この行を削除すると、プログラムをコンパイルできます。

parallel_for(blocked_range<size_t>(0, num_elem ),
           SubStringFinder( to_scan, max, pos ) );

これにより、TBB ライブラリが役に立たなくなります。

さらに、私は追加しました

 export /opt/tbb41_20121003oss/build/linux_intel64_gcc_cc4.4.6_libc2.12_kernel2.6.32_release/  

.bashrcに

私はセントを使っています。

4

0 に答える 0