OpenGL de プログラミング - TBB::多重ループ
現在地 >> メニュー >> TBB >> TBB::多重ループ

問題


九九のデータを2次元配列で用意し、その各データに1000を加えよ。

答え


#include <iostream>
#include <cmath>
#include <tbb/task_scheduler_init.h>
#include <tbb/blocked_range2d.h>
#include <tbb/parallel_for.h>

using namespace std;
using namespace tbb;

const int MAT_M = 9; //行(縦)
const int MAT_N = 9; //列(横)

class C_9x9
{
private:
int (*data)[MAT_N]; //MAT_N(横)だけ要素を持つ配列へのポインタ


public:

/******* コンストラクタ ***********/
C_9x9(int (*p)[MAT_N]):data(p){}

/******* オペレータ ***************/
void operator()(const blocked_range2d<int,int>& range)const
{
for(int m = range.rows().begin(); m != range.rows().end();++m)
{
for(int n = range.cols().begin(); n != range.cols().end();++n)
{
data[m][n] += 1000;
}
}

}

};



/**************** ここからメイン関数 ********************/

int a[MAT_M][MAT_N];
int main()
{

for(int m = 0; m < MAT_M; ++m)
{
for(int n =0; n < MAT_N ; ++n)
{
a[m][n] = (m+1)*(n+1);
cout << a[m][n] << " ";
}
cout << "\n";
}

cout << "------------ [after] ------------------\n";


tbb::task_scheduler_init Tbb_Init;

parallel_for( blocked_range2d<int,int>(0,MAT_M,0,MAT_N), C_9x9(&a[0]),auto_partitioner());

Tbb_Init.terminate();


for(int m = 0; m < MAT_M; ++m)
{
for(int n =0; n < MAT_N ; ++n)
{
cout << a[m][n] << " ";
}
cout << "\n";
}

return 0;
}

メモ


ポインタについて...

以下の二つは違うもの。
  1. int (*data)[10];
  2. int *data[10];

「1」は10だけ要素をもつ配列へのポインタ。
「2」はポインタ型の変数が10個分

という事である。

故に、
クラスに引数として与える時は、「MAT_N」だけ要素をもつ配列のアドレスを指定する。

[例]

parallel_for( ... ... , C_9x9(&a[0]), ... ...);