求高人~想把一个程序改成并行的,就用了openmp。为什么并行执行时间是串行的好几倍

i_am_wanwan 2015-11-02 10:04:18
omp_set_nested(1);
omp_set_num_threads(2);
#pragma omp parallel for
for(i=0;i<10;i++)
{
#pragma omp parallel for
for(j=0;j<10;j++)
{
s1.s[i][j]=1.0-s1.s[i][j];

}
}

我调用了omp_in_parallel()函数,上段代码确实是在并行之中的。但是运行时间就是之前的两三倍。
还有一个问题就是我在omp_set_num_threads(2);中设置了并行的线程为2。因为我电脑自己的cpu是双核的,所以不知道如何设置大于2的话是不是可以(反正不管线程设置为几,我调用omp_get_num_procs()函数返回的可用线程数都是2)
看有的地方说可能是数据太少了,但是我程序里还有一个部分是2000多个数据的循环,还是并行时间比串行时间长。不知道问题出在哪了了。谢谢各位!
...全文
4174 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_39172945 2017-12-04
  • 打赏
  • 举报
回复
多线程不能用clock计时。clock是所有cpu的滴答数总和,当然进程越多占用cpu越多显示时间越长。 换成omp_get_wtime();就可以了
cut_cat 2015-11-26
  • 打赏
  • 举报
回复
#include<iostream>
#include<omp.h>
#include<ctime>
using namespace std;
void test_omp(int times);
int main()
{
	cout << omp_get_num_procs() << endl;
	test_omp(1);
	test_omp(2);
	test_omp(4);
	test_omp(9);
	test_omp(17);
}
void test_omp(int times)
{
	omp_set_num_threads(times);
	printf("test get_num_threads result1: %d\n", omp_get_num_threads());
	printf("test get_num_procs result1: %d\n", omp_get_num_procs());
	clock_t start = clock();
#pragma omp parallel for
	for (int i = 0; i < 20; i++)
	{
		if(i==0)
		{
			printf("test get_num_threads result2: %d\n", omp_get_num_threads());
			printf("test get_num_procs result1: %d\n", omp_get_num_procs()); 
		}
			
		printf( "Hello from thread: No.%d \n", omp_get_thread_num());
			for (int j = 0; j < 1000000; j++)
			{
				double a = 1585876.058578545361;
				for (int k = 0;k < 10;k++)
					a *= a;
			}
		
	}
	clock_t end = clock();
	printf("%d threads para use time: %fs\n", times, double((end - start)) / CLOCKS_PER_SEC);
}
运行时间问题还是因为每个线程任务量太小不够开并行的,上边代码debug还可以看到一点时间差别, 获取线程数的函数是omp_get_num_threads, 具体参照代码及运行结果可以看出来,才发现过去这么久了已经。。。
神-气 2015-11-10
  • 打赏
  • 举报
回复
力度太细了,线程启动关闭时间这个循环早就结束了。
i_am_wanwan 2015-11-03
  • 打赏
  • 举报
回复
求解啊!!!
i_am_wanwan 2015-11-02
  • 打赏
  • 举报
回复
我是在visualstudio2010里运行的。
i_am_wanwan 2015-11-02
  • 打赏
  • 举报
回复
我是在visualstudio2010里运行的。

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧