社区
英特尔边缘计算技术
帖子详情
关于双核并行后的错误
memoryjs
2009-06-11 09:48:13
我用双核并行马太棋盘,用intel编译器后,运行速度是快了,但是出来的结果是错误的,如果不用并行,那么时间会长,但是答案是对的 我用的是 #pragma omp task #pragma omp parallel #pragma omp single 这三个命令并行的 是不是我代码用错 还是什么别的?而且我并行别的程序也是用这三个指令都有错误 ...
...全文
144
15
打赏
收藏
关于双核并行后的错误
我用双核并行马太棋盘,用intel编译器后,运行速度是快了,但是出来的结果是错误的,如果不用并行,那么时间会长,但是答案是对的 我用的是 #pragma omp task #pragma omp parallel #pragma omp single 这三个命令并行的 是不是我代码用错 还是什么别的?而且我并行别的程序也是用这三个指令都有错误 ...
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fanbin23
2009-06-16
打赏
举报
回复
OpenMP官网上有个tutorial链接,另外随便搜搜能找到一些slides,稍微有点概念就行了,看多了也没啥用
https://computing.llnl.gov/tutorials/openMP/
TBB就不知道了
fanbin23
2009-06-15
打赏
举报
回复
看材料其实没啥用,你可以就从这个程序入手,想清楚为什么要这么写,为什么这么用那几个OpenMP directives。弄明白了基本上OpenMP你就懂了一大半了
memoryjs
2009-06-15
打赏
举报
回复
就是弄不懂openMp 和TBB怎么用
memoryjs
2009-06-14
打赏
举报
回复
的确不太理解 我找了一些资料 感觉帮助不大 用了之后速度没有提高多少 要不你推荐一下?
fanbin23
2009-06-14
打赏
举报
回复
看起来你还没理解什么是并行和OpenMP……找一些基本的材料看看吧,具体是什么材料……我现在也想不起来该推荐什么
OpenMP和TBB都是编写并行程序的方式而已
memoryjs
2009-06-13
打赏
举报
回复
这个道理我也知道啊 但是我不并行是对的 并行就错了 我都不知道是哪里错了 要不你也帮忙看看
loadbalancing
2009-06-13
打赏
举报
回复
结果是错误的,则并行没有意义了。首先得保证结果是对的。
memoryjs
2009-06-13
打赏
举报
回复
虽然不是很懂 但是我还是试试看 那么并行程序就是用openmp的命令?还有TBB?
fanbin23
2009-06-13
打赏
举报
回复
没仔细看,但有这么几个建议:
1. 按照你对程序的理解把parallel region中所有用到的变量显示的指明他们的data sharing clause,例如g,h,k,m,n和数组a。如果你用linux,或许你可以试一下Sun Studio OpenMP compiler的autoscoping工具
2. move_chess似乎是个递归函数,或许你应该考虑把parallel single结构拿到递归外面去,只在递归函数里面使用task
memoryjs
2009-06-12
打赏
举报
回复
我贴了代码了 你帮忙看看
memoryjs
2009-06-12
打赏
举报
回复
我是用文件读如的 文件名为hamilton.in 没有tet后缀名 里面的内容是 6 6 1 即是一个6*6上的一个棋盘上 在1这个位置为起点 数字大了 运行时间太长 我用单核这个时间为5秒左右 用双核并行就错了 你可以试试
memoryjs
2009-06-12
打赏
举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void read_file(int *m,int *n,int *p);
int write_file(int *m,int *n);
void draw_chessboard(int *m,int *n);//根据m,n画棋盘
void find_location(int *m,int *n,int *p,int *i,int*j);//根据数值,找出坐标
void move_chess(int i,int j,int k,int m,int n);
int c[32][32],a[32][32];//c是画的棋盘,a是用来记录每一步
int ok=0;//0为不成功,1为成功
main()
{
int m,n,p,i,j;
double d;
time_t begin,end;
a[0][0]=0;
read_file(&m,&n,&p);
printf("%d %d\n",m,n);
printf("%d\n",p);
draw_chessboard(&m,&n);
find_location(&m,&n,&p,&i,&j);
a[i][j]=1;//初始化,使得得到的坐标为第一步
begin=clock();
move_chess(i,j,2,m,n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ printf(" %d ",a[i][j]);
if(j==n-1)
printf("\n");
}
end=clock();
d=(double)(end-begin)/CLOCKS_PER_SEC;
printf("your run time is:%f\n",d);
}
void move_chess(int i,int j,int k,int m,int n)
{
int x,g,h,p=-1;//g记录i的变化,h记录j的变化,p每次运行都要加1,所以定义为负数,用来访问数组
int direction[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};//定义8个方向
do{
p++;
ok=0;
g=i+direction[p][0];
h=j+direction[p][1];
#pragma omp parallel
#pragma omp single
if(g>=0&&g<m&&h>=0&&h<n&&a[g][h]==0){
a[g][h]=k;
if(k<m*n){
#pragma omp task
move_chess(g,h,k+1,m,n);
if(ok==0)
a[g][h]=0;//如果八个方向都不行,从函数退出,并且使原来尝试的一步清零
}
else
for(x=0;x<8;x++)
if((g+direction[x][0])<m&&(g+direction[x][0])>=0&&(h+direction[x][1])<n&&(h+direction[x][1])>=0&&a[g+direction[x][0]][h+direction[x][1]]==1) {
ok=1;break;
}
if(ok==0) a[g][h]=0;
}
}while(ok==0&&p!=7);
}
void find_location(int *m,int *n,int *p,int *i,int *j)
{
int k=0;
for((*i)=0;(*i)<*m;(*i)++)
{
for((*j)=0;(*j)<*n;(*j)++)
if(c[*i][*j]==*p){
k=1;
break;
}
if(k==1)
break;
}
// printf("%d %d\n",*i,*j);
}
void read_file(int *m,int *n,int *p)
{
FILE *fp;
if((fp=fopen("hamilton.in","r"))==NULL){
printf("Opent the hamilton.in file fail!\n");
exit(0);
}
fscanf(fp,"%d",m);
fscanf(fp,"%d",n);
fscanf(fp,"%d",p);
}
void draw_chessboard(int *m,int *n)
{
int i,j,s,count=0;
s=(*m)*(*n);
for(i=0;i<*m;i++)
for(j=*n-1;j>=0;j--)
{
c[i][j]=s-1;
s--;
}
/* for(i=0;i<*m;i++)
for(j=0;j<*n;j++)
{
printf(" %d ",c[i][j]);
count++;
if(count==8){
printf("\n");
count=0;
}
}*/
}
帮忙看看 哪里错了
无天
2009-06-12
打赏
举报
回复
代码?
fanbin23
2009-06-12
打赏
举报
回复
Thread Checker
Thread Inspector
Sun Studio Thread Analyzer
贴代码
....
denghui0815
2009-06-11
打赏
举报
回复
估计你有需要同步的数据访问没有做同步
双核
机器使用openmp简单测试opencv
在
双核
Intel机器上,通过OpenMP对OpenCV进行
并行
处理测试,发现仅少数函数如cvCalcOpticalFlowPyrLK有所加速,优化效果不明显,瓶颈可能在于硬盘IO、摄像头IO和内存IO。提供了一个简单的OpenMP
并行
测试示例。
《Parallel Tracking and Mapping for Small AR Workspaces》阅读笔记一
本文介绍了将跟踪和映射任务
并行
处理的SLAM算法,适用于小型AR工作空间。通过将跟踪和绘图分为两个线程,分别在
双核
计算机上运行,提高了稳定性和效率。论文探讨了与传统SLAM方法的区别,包括使用批量优化技术进行地图构建,以及如何应对数据关联
错误
。此外,还比较了与其他相关工作的差异和优势。
OpenOCD隐藏技巧:用TCL脚本自动化你的嵌入式调试工作流
本文详解OpenOCD内嵌TCL脚本引擎的高级应用,涵盖批量固件烧录(单/多设备
并行
)、自定义寄存器监控、智能软断点、RP2040
双核
协同调试及ESP32 OTA集成,并强调
错误
恢复、会话优化与健壮性设计,助力嵌入式开发实现高效率、可复现、工业级自动调试工作流。
保姆级教程:在Ubuntu 20.04上搞定安信可BW16模组SDK编译与固件打包(附一键脚本)
本文详解在Ubuntu 20.04上配置安信可BW16模组开发环境的全流程,涵盖一键式依赖安装、智能SDK版本管理、RTL8720DN
双核
(KM0/KM4)
并行
编译优化、自动化固件打包(含CRC校验与版本注入)及烧录验证。重点解决GLIBC冲突、Python环境隔离、链接
错误
、内存溢出等典型编译问题,并提供工业级调试与性能优化方法。
超越main函数:在ESP-IDF的启动世界中重构应用初始化逻辑
本文深入剖析ESP-IDF三级启动流程与
双核
协同机制,指出app_main并非真正起点,而应作为主任务入口用于创建子任务。提出基于阶段划分(预OS/核心服务/外设/应用/网络)和优先级排序的模块化初始化框架,支持懒加载、
错误
恢复、状态追踪及
并行
初始化。强调RTOS环境下同步策略、竞态规避与启动性能优化(如时间分析、内存控制),并通过单元测试、故障注入和诊断日志保障初始化可靠性。
英特尔边缘计算技术
568
社区成员
7,024
社区内容
发帖
与我相关
我的任务
英特尔边缘计算技术
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
复制链接
扫一扫
分享
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章