ホーム » VC OpenMP » ループ部分の OpenMP 対応

2018年5月
 12345
6789101112
13141516171819
20212223242526
2728293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 77,354 アクセス



ループ部分の OpenMP 対応

効果は低かったが,OpenMP を利用したコードに書きなおしてみた.


//---	オリジナルのコード  ----------------------------------------------------------------
	Ld2A	lins ;
	{
		for (size_t indexVV=0 ; indexVV<vv_plf.size() ; indexVV++) {
			v_PLF	v_plf = vv_plf[indexVV] ;
			if (v_plf.size() == 0)		{	continue ;		}
			for (size_t indexV=0 ; indexV<v_plf.size() ; indexV++) {
				PLF	plf = v_plf[indexV] ;
				if (plf.Is_line()) {
					Vd4A	v4a = plf ;
					Vd3A	v3a = ::ToVd3A(v4a) ;
					Vd2A	v2a = ::ToVd2A(v3a) ;
					for (size_t indexL=1 ; indexL<v2a.size() ; indexL++) {
						Vd2	s = v2a[indexL-1] ;
						Vd2	e = v2a[indexL-0] ;
						Ld2	lin(s,e) ;
						lins.push_back(lin) ;
						}
					}
				}
			}
		}
//----	OpenMP 対応 ------------------------------------------------------------------------
Ld2A	PLF_to_Ld2A	(const v_PLF& v_plf)
{
	Ld2A	lins ;
	{
		for (size_t indexV=0 ; indexV<v_plf.size() ; indexV++) {
			PLF	plf = v_plf[indexV] ;
			if (plf.Is_line()) {
				Vd4A	v4a = plf ;
				Vd3A	v3a = ::ToVd3A(v4a) ;
				Vd2A	v2a = ::ToVd2A(v3a) ;
				for (size_t indexL=1 ; indexL<v2a.size() ; indexL++) {
					Vd2	s = v2a[indexL-1] ;
					Vd2	e = v2a[indexL-0] ;
					Ld2	lin(s,e) ;
					lins.push_back(lin) ;
					}
				}
			}
		}
	return	lins ;
	}

Ld2A	PLF_to_Ld2A	(const vv_PLF& vv_plf)
{
	Ld2A	lins ;
	{
		#ifdef	_OPENMP
			#pragma	omp	parallel for
		#endif
		for (long indexVV=0 ; indexVV<long(vv_plf.size()) ; indexVV++) {
			v_PLF	v_plf = vv_plf[indexVV] ;
			if (v_plf.size() == 0)		{	continue ;		}
			Ld2A	ln_a = ::PLF_to_Ld2A(v_plf) ;
			#ifdef	_OPENMP
				#pragma	omp	critical	(PLF_to_Ld2A)
			#endif
			{
				lins.insert(lins.end(),ln_a.begin(),ln_a.end()) ;
				}
			}
		}
	return	lins ;
	}

ループ部分を並列化した実行結果

C:\Users\Iwao>C:\Temp\Test\Fill\GetX_1\ReleaseS.140\GetX_1.exe
31.856

C:\Users\Iwao>C:\Temp\Test\Fill\GetX_1\Release.140\GetX_1.exe
20.202

C:\Users\Iwao>

v_Vd2A	GetCross	(const vv_PLF& vv_plf,const Vd2& pt)
{
	Ld2A	lins = ::PLF_to_Ld2A(vv_plf) ;
	v_Vd2A	v_pnts ;
	{
		Vd2A	pnts ;
		pnts.push_back(pt) ;
		v_pnts.push_back(pnts) ;
		}
	{
		Ld2		lh(pt,pt+Vd2(1,0)) ; 
		Ld2		lv(pt,pt+Vd2(0,1)) ; 
		Vd2A	work_pnts ;
		#ifdef	_OPENMP
			#pragma	omp	parallel for
		#endif
		for (long index=0 ; index<long(lins.size()) ; index++) {
			Vd2	s = lins[index].S ;
			Vd2	e = lins[index].E ;
			Ed2	ext(s,e) ;
			Vd2	x ;
			if (get_cross_line(s,e,lh.S,lh.E,&x)) {
				if (::Is_point_in_extent(x,ext)) {
				//	pnts.push_back(x) ;
					}
				}
			if (get_cross_line(s,e,lv.S,lv.E,&x)) {
				if (::Is_point_in_extent(x,ext)) {
				//	pnts.push_back(x) ;
					}
				}
			{
				Vd2	h = ::get_near_on_line(s,e,pt) ;
				if (::Is_point_in_extent(h,ext)) {
					#ifdef	_OPENMP
						#pragma	omp	critical	(GetCross)
					#endif
					{
						work_pnts.push_back(h) ;
						if (work_pnts.size() > 10) {
							v_pnts.push_back(work_pnts) ;
							work_pnts.clear() ;
							}
						}
					}
				}
			}
		v_pnts.push_back(work_pnts) ;
		}
	return	v_pnts ;
	}

ループ部分の OpenMP 対応

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

%d人のブロガーが「いいね」をつけました。