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;
}
メモ
ポインタについて...
以下の二つは違うもの。
int (*data)[10];
int *data[10];
「1」は10だけ要素をもつ配列へのポインタ。
「2」はポインタ型の変数が10個分
という事である。
故に、
クラスに引数として与える時は、「MAT_N」だけ要素をもつ配列のアドレスを指定する。
[例]
parallel_for( ... ... , C_9x9(&a[0]), ... ...);