并行计算究竟是哪些在并行

入门参考:https://www.cnblogs.com/hantan2008/p/5961312.html

今天在弄一个多线程的事情,由一个线程转为多线程,固定的任务所花费的时间基本上没有减少,多线程不管是2个还是4个(4核电脑),单线程花费19分30秒,2线程花费17分10秒,4线程花费16分30秒,这个效率提升的太少了,为了提高效率,搜索并行计算的文章,之间有个工程也用了一下并行计算,但由于依赖omp那个库文件,导致有的电脑上没有办法运行,所以也就直接屏蔽掉了,今天由于任务繁重(上面的时间只是测试了效率,实际上任务数量可能是上面的200倍以上),所以还是想看看并行计算是否可行。

下面的试验环境:

vs2015,64位mfc工程,win7 64bit系统

 

通过搜索上面的那个网址,基本形式知道咋写了,于是有了下面的入口代码:

void BdBody(const int tindex)
{
	CString strText;
	strText.Format(TEXT("线程编号:%d.\n"), tindex);
	OutputDebugString(strText);
}

int tCount = 4;
void BdBodyP()
{
	int im = 0;
#pragma omp parallel num_threads(tCount)
	for (im = 0; im < tCount; im++)
	{
		BdBody(im);
	}
}

在运行时,发现和想像中的不一样,预期打印为:

线程编号:0.
线程编号:1.
线程编号:2.
线程编号:3.
 

实际打印却是:

线程编号:0.
线程编号:1.
线程编号:2.
线程编号:3.
线程编号:0.
线程编号:1.
线程编号:2.
线程编号:3.
线程编号:0.
线程编号:1.
线程编号:2.
线程编号:3.
线程编号:0.
线程编号:1.
线程编号:2.
线程编号:3.
 

这样子看,是每个线程都for循环了一遍,找个方法试试:

#pragma omp parallel num_threads(tCount) private(im)

这一行后面加个private(im),运行,结果打印没变,说明这样是无效的。那改成如下的样子试试:

void BdBodyP()
{
	int im = 0;
#pragma omp parallel num_threads(tCount)
	//for (im = 0; im < tCount; im++)
	{
		BdBody(im++);
	}
}

结果发现,打印可能不规律,其中的一次打印如下:

线程编号:0.
线程编号:1.
线程编号:1.
线程编号:3.
 

说明 im++ 并不是按顺序执行的,多种尝试都不行,没办法,只好在线程里面加索引了,大致如下:

// m_bdThreadIndex 在调用BdBodyP()之前,会置为0,m_csVec为互斥变量
void BdBody()
{
	int tid = 0;
	{
		CAutoCri cri(m_csVec);
		tid = m_bdThreadIndex++;
	}

	CString strText;
	strText.Format(TEXT("线程编号:%d.\n"), tindex);
	OutputDebugString(strText);
}

int tCount = 4;
void BdBodyP()
{
#pragma omp parallel num_threads(tCount)
	BdBody();
}

这样加之后,发现好了,多次测试也都正常了:

线程编号:0.
线程编号:1.
线程编号:2.
线程编号:3.
 

通过这个调试,终于弄明白了并行的写法,是对它下面的整个部分进行“并行”,而不是像我看到的所有网上搜索出来的那样,所以网上的写法很容易让人产生误解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值