###前提・実現したいこと
Intelのtbbライブラリによる並列化方法について(c++)
tbbライブラリのparallel_for関数を使って並列計算をしたいのですが上手くいきません。
言語はc++ですが普段はc言語をメインとしており、クラスなどの知識は少ないです。
なぜこの問題が起きるのか教えてください。
またtbb::blocked_range等の関数が必要になるのならば、その使い方についても教えていただけると嬉しいです。
(理想は下のコードの様にクラスを使わずに並列計算を行いたいです)
よろしくお願いします。
###発生している問題
実行ごとに結果が変わってしまう
1回目の結果一部
1095.04
1027.97
1043.29
2回目の結果一部
1095.04
1016.81
946.124
###該当のソースコード
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <tbb/tbb.h>
#include <tbb/parallel_for.h>
using namespace std;
float calc_distance(int *data, int *center){
int i;
float dist = 0;
tbb::parallel_for(0, 128, [&](int i){
dist += (data[i] - center[i]) * (data[i] - center[i]);
});
dist = sqrt(dist);
return dist;
}
int main(int argc, char* argv[]) {
int i,j;
FILE *fp;
fp = fopen(argv[1], "r");
int feature_num;
fread(&feature_num, sizeof(int), 1, fp);
int data[feature_num][128];
for(i = 0; i < feature_num; i++)
for(j = 0; j < 128; j++) fread(&data[i][j], sizeof(int), 1, fp);
for(i = 0; i < feature_num - 1; i++)
cout << calc_distance(data[i], data[i + 1]) << endl;
fclose(fp);
return 0;
}
これはファイルからデータを読み込み2次元配列に格納した後、それらの距離を求めて表示するプログラムです。
なお、読み込みを行うファイルには以下のように0~255の範囲の整数がfeature_num * 128個入っています。
(一番初めの値はfeature_num)
1196 97 90 87 78 57 59 ・・・
###試したこと
該当箇所を以下のように変えてみましたが駄目でした。(今起きている問題とは関係がない?)
tbb::parallel_for(tbb::blocked_range(0, 128), [&](tbb::blocked_range<int> range){
for(i = range.begin(); i < range.end(); i++)
###補足情報(言語/FW/ツール等のバージョンなど)
言語:c++
OS:ubuntu16.04
サンプルファイルへのリンク
回答3件
あなたの回答
tips
プレビュー