- 相关推荐
学习方法多核诊断题
学习方法多核诊断题
一、请仔细阅读每一道题,将题目中所讲述的内容同自己的实际情况相对照,看看符合程度如何,并按照以下评定标准评定。
A=完全符合自己的情况 B=大体上符合自己的情况 C=有一些符合自己的情况D=完全不符合自己的情况
1、上课时,我头脑里往往会想些别的事,以致于老师讲的许多内容我都似乎没有听到。
2、上课时我总是聚精会神地听老师的讲解。
3、某些主要的学科或一门学科中我认为特别难学的或特别重要的章节,我总争取预习(在课前或晚上)。
4、我的记忆力还不错,背诵一篇课文 或记住学习的东西对我来说不是太难的事。
5、阅读课本或其他读物时我很少用红蓝笔或其他笔画线做记号。
6、在寒暑假期间,我常常要制定一个学习计划并努力按照计划去学点新知识 。
7、要背诵课文时,我常常在诵读几遍之后就开始试背,然后再打开书诵读几遍,再试背 ,也就是让诵读和背诵交替进行。
8、作业中有些不好解答的题目,我总是自己尽力想办法解答,不到万不得已,不去问老师和同学。
9、我常常把一些我认为写的好的文章反复诵读。
10、学习时,我时常把教材内容分解为若干内容或若干知识点。
11、考试后全班最好的成绩是多少分、是谁,我总是最感兴趣。
12、我常常由于能有条理的扼要的回答老师的提问而受表扬。
13、上课或自己复习功课时,我常常觉得时间过得很慢。
14、学习时,我不仅能够弄清楚各个部分各个要点的意思,而且能较快的弄清楚各个部分各个要点之间的联系和关系。
15、在课堂上,老师呈示的挂图、模型、标本或进行的演示实验,我总是争取看得清清楚楚,弄明白他说明什么问题或可以得出什么结论。
16、语文课本中的课文,我很少去反复诵读,我认为只要会解释,懂得大意,做做作业就行。
17、我在阅读报纸或其他课外读物时,要出声或默默地一个字一个字的读下去,所以速度比较慢。
18、上课时,我尽力想象老师所讲的内容,也就是说,如果有可能的话,我就把老师所讲的内容变成形象在头脑中显现出来。
19、做作业时碰到难题我常常找其他人帮助解决,以免自己花太多的时间去琢磨。
20、虽然我重理解,不爱死记课本中的字句,但对于一些关键性的问题和公式,我还是 努力记住记熟。
21、做问答题时,我往往心里觉得都理解了,可是动笔去写又写不好。
22、写文章或做问答题时,我常常要先列出大纲或要点,然后才下笔去写。
23、阅读一篇文章或课文时,我能迅速的抓住各段的段落大意和全篇的中心思想。
24、我尽量作到当天的功课当天就进行复习和写作业。
25、我重视平时的复习,考试前夕倒不怎么紧张,有时反而出去玩一玩,让头脑休息休息。
26、我喜欢独立学习独立思考,但遇到问题时,我也喜欢和同学一起讨论。
27、听老师讲解知识时,我自己往往还联想起于此相关的一些知识或事例。
28、读物理化学时,我很重视书上说的各种实验,尽力想象实验进行的真实情景。
29、上课时,有时老师要讲的内容还没有讲完,我就知道他要说什么或要做出什么结论。
30、学习时,我经常把新材料和已有的知识经验联系起来。
31、学习比较抽象的材料时,我总是努力联系实际,或举出一些具体的例子去说明它。
32、读书时用笔画线做记号是一件很困难的事,因为我往往分不清哪些地方该画,哪些地方不该画。
33、听课时,我往往把不了解的问题或联想起来的问题记下,以便课后进一步思考、弄清。
34、老师布置的作业我总是努力按时完成。
35、由于种种原因,我很难每天在固定的时间开始做功课。
36、我能够把详细的教材缩写成提纲,必要时,我又能根据提纲进行发挥,写出详细的内容。
37、上课时,我专心听讲,紧紧抓住老师讲解的线索,积极思考老师所讲的内容。
38、学习理、化、生物、地理学科,我不单用头脑想,只要可能,我总是动手去试做一下。
39、听老师讲课时,我总喜欢动笔记一些要点、纲要。
40、学习时,我不满足于记一些公理、公式、定义、结论,我总是想方弄清楚它们是怎么得来的。
41、在回答问题时,我喜欢根据自己的理解,用自己的话去回答,很少硬背课本上的字句。
42、我的书桌总是整理的整整齐齐,各种学习用品总是放在固定的位子。
43、我喜欢把学到的知识用来解决或解释生活上或课外活动中碰到的问题。
44、在上课或听报告时,我能够把老师讲的内容扼要地、系统的记下来。
45、考试时,我总是先把考题看一下,把容易做的或得分多的题目先做了把难做的题目留到最后去想。
46、在学习时,我总是力求弄清教材中各部分、各要点之间的联系或关系。
47、在准备考试时,我常常先提出一些问题考自己,看看准备是否充分了。
48、我的学习用品随便放,以致要用时常常要找好久。
49、我每天总是在固定时间里复习功课,完成作业。
50、在准备考试时,我常常根据教科书写出各道复习题的答案要点。
51、发回的作业或卷子,如果有做错的,我总要弄清楚为什么错了,怎样做才对。
52、在复习功课时,我喜欢把详尽的材料变成简要的提纲,以便更好的记住。
53、我常常把学到的各种知识进行比较,发现它们之间的异同和联系。
54、在阅读报纸小说或某些课外读物时,我不需要一个字一个字的读,而是一个分句或一个整句的读,所以速度比较快。
55、复习功课时,我常常把学过的知识列成表或画成图,借以揭示各种知识的区别和联系。
56、学过的各种知识,我一般都能有条理有系统的保存在脑子里,所以,要用到某一概念或定理时,我能很容易的找到它。
57、我重视学习经验的总结,并时常和同学交流学习经验。
58、学习时,我喜欢思考,即使很难理解的材料,我也总要想办法把它彻底弄懂。
59、我在动手做作业之前,总是先把功课认真的复习一遍,弄懂教材的内容。
60、我挺喜欢学习,学习使我每天都在增长知识、开阔眼界。
二、下面有50道题,每道题有3个备选项,请根据自己的实际情况选择,每题只能选择一种结果。
A.较符合自己的情况 B.难回答 C.不符合自己的情况
第一部分:学习方法
1.喜欢用笔勾出过记下阅读中不懂的地方。 A. B. C.
2.经常阅读与自己学习无直接关系的书籍。 A. B. C.
3.在观察或思考时,重视自己的看法。而且在遇到问题时,对自己的看法很有信心。 A.
B. C.
4.在对老师将要讲的课会做很充分的预习,并且会预先做一些练习。 A. B. C.
5.遇到问题,我喜欢和同学一起讨论。 A. B. C.
6.为更好地理解老师讲的课程,我会对笔记等内容归纳成太哦问或图表。 A. B. C.
7.听老师讲解问题时,眼睛注视着老师。 A. B. C.
8.我喜欢利用参考书和习题集。 A. B. C.
9.对于学习中的要点,我会很注意归纳并写出来。 A. B. C.
10.我不经常查阅字典、手册等工具书。 A. B. C.
11.我对作业和考试中的错误会进行修改,并根据试卷分析自己错误的原因。 A. B. C.
12.我认为重要的内容,就格外注意听讲和理解。 A. B. C.
13.阅读中若有不懂的地方,非弄懂不可。 A. B. C.
14.在学习的时候会经常联系其他学科内容进行学习。 A. B. C.
15.在动笔解题以前,先做全面的审题,有了设想后,才去解题。 A. B. C.
16.阅读中认为重要的或需要记住的地方就划上线或做上记号。 A. B. C.
17.经常向老师或他人请教不懂的问题。 A. B. C.
18.喜欢讨论学习中遇到的问题。 A. B. C.
19.我很注意别人好的学习方法,并努力学会。 A. B. C.
20.对需要记牢的公式、定理等反复进行记忆。 A. B. C.
21.经常观察实物或参考有关资料对其进行学习。 A. B. C.
22.听课时做完整的笔记。 A. B. C.
23.我有专门的错题本。 A. B. C.
24.如果实在不能独立解出习题,就看了答案再做。 A. B. C.
25.我经常制定学习计划,但不一定按照计划来做。 A. B. C.
第二部分:应试心理
26.在重要考试的前几天,我就坐立不安了。 A. B. C.
27.我每天早上都会吃饭而且早餐很有营养。 A. B. C.
28.在考试前,我总感到苦恼。 A. B. C.
29.在考试前,我感到烦躁,脾气变坏。 A. B. C.
30.在紧张的温课期间,常会想到:这次考试要是得到低分数怎么办? A. B. C.
31.越临近考试,上课时我的注意力就越难集中。 A. B. C.
32.一想到马上就要考试了,参加任何文娱活动都感到没劲。 A. B. C.
33.在考试前,我常做关于考试的梦。 A. B. C.
34.到了考试那天,我就不安起来。 A. B. C.
35.当听到开始考试的铃声响了,我的心马上紧张地急跳起来。 A. B. C.
36.遇到重要考试,我的脑子就变得比平时迟钝。 A. B. C.
37.看到考试题目越多、越难,我就越感到不安。 A. B. C.
38.一遇到很难的考试,我却担心自己会不及格。 A. B. C.
39.在紧张的考试中,我却会想些与考试武官的事情,注意力集中不起来。 A. B. C.
40.在考试时,我会紧张得连平时记得滚瓜烂熟的知识一点也回忆不起来。 A. B. C.
41.考试中,我想上厕所的念头比平时多些。 A. B. C.
42.我对考试十分厌烦。 A. B. C.
43.在考试时,我紧张得手发僵,写字不流畅。 A. B. C.
44.考试时,我经常会看错题目。 A. B. C.
45.在进行重要的考试时,我的头就会痛起来。 A. B. C.
46.发现剩下的时间来不及做完考题,我就急得手足无措,浑身大汗。 A. B. C.
47.如果我考个不满意的分数,就不想看卷子。 A. B. C.
48.在考试后,经常发展有的题目自己虽然懂却没答对。 A. B. C.
49.在考试中,有时我会沉迷在空想之中,一时忘了自己是在考试。 A. B. C.
50.要是不进行考试,我就能学到更多的知识。 A. B. C.
三、听老师讲课的时候,你所采取的方法、方式是:
A、紧张地盯着黑板,认真仔细地做笔记;
B、只记重点,课后再回想一遍;
C、认真地听,适当地做笔记,疑难的地方做出标记,课后再做系统地复习;
D、以“考前猜题”的心态听课,抓住老师反复强调的内容。
四、每当在课堂上教师提出问题时,你一般的做法是:
A、只要懂的就举手回答;
B、即使懂也不敢举手回答;
C、不仅不愿举手回答问题,即使被老师提问到了,有时也不愿回答问题;
D、对于老师所提的问题,大多数都不懂。
五、学生做作业的态度是:
A、比较归类,将零星的知识纳入自己的知识体系之中,并寻求一题多解的途径;
B、注意更正错题,对习题资料加以整理和保存,并围绕中心做课外习题;
C、只要完成作业就可以了;
D、抄袭。
六、学生是怎样背记英语单词的?
A、依赖书写的方法来记;
B、用卡片来记;
篇二:多核编程和并行运算期末复习
5题每题20分
1.1)简述MPI 6个函数格式定义,作用,参数含义。
MPI简介:消息传递接口的标准,用于开发基于消息传递的并行程序,目的是为用户提供一个实际可用的、可移植的、高效和灵活的消息传递接口库,能够在PC Windows和所有主要的Unix工作站以及并行机上实现。MPI是一个库,不是一种语言,实现并行必须依托于某种语言:FORTRAN,C
MPI主要函数:
MPI_Init,初始化函数:MPI程序通过调用MPI_Init函数进行MPI环境,并完成所有的初始化工作,这个函数通常是MPI程序的第一个函数调用。
格式如下: int MPI_Init( int *argc, char ***argv )
MPI_Finalize,结束函数:MPI通过调用MPI_Finalize函数从MPI环境中退出,它是MPI程序的最后一个MPI函数调用,否则程序的执行结果是不可预知的。
格式如下: int MPI_Finalize(void) ;
MPI_Comm_rank,获取进程的编号:MPI程序通过MPI_Comm_Rank函数调用获取当前进程在指定通信域中的编号,有了该编号,不同的进程就可以将自身和其他进程区分开来,从而实现进程间的并行和合作。
格式如下:nt MPI_Comm_rank(MPI_Comm comm, int *rank)
MPI_Comm_size,获取指定通信域的进程数:MPI通过调用MPI_Comm_size函数获取指定通信域的进程个数,进程可根据它来确定自己应该完成的任务比例。
格式如下:int MPI_Comm_size(MPI_Comm comm, int *size)
MPI_Send消息发送函数:MPI_Send函数用于发送一个消息到目标进程。其格式如下:
int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm_comm)
buf : 消息发送的起始地址
count :发送消息的数量
datatype: 发送数据的类型
dest: 标识目标进程
tag: 发送消息时打上的标签
comm: 通信类型
MPI_Recv,消息接收:MPI_Recv函数用于从指定进程接收一个消息,格式如下:
int MPI_Recv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm, comm, MPI_Status *status )
buf : 消息接收后存放地址
count : 接收数量
datatype : 接收数据类型
source : 发送消息的进程
tag : 消息的标签
comm : 通信类型
status : 接收状态
1.2)举例简单的应用解释如何通信。
每个进程会属于一个或多个通信域。
一个简单的例子
/* simple.c */
#include “mpi.h” /*MPI头文件*/
#include
int main(argc, argv)
int argc ;
char **argv ;
{
int rank, size, tag = 1 ;
int senddata, recvdata ;
MPI_Status status ;
MPI_Init( &argc, &argv ) ; /*MPI的初始化*/
MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; /*该进程的编号 */
MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 总的进程数目*/
if ( rank == 0 ){
int senddata, recvdata ;
MPI_Status status ;
MPI_Init( &argc, &argv ) ; /*MPI的初始化*/
MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; /*该进程的编号 */
MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 总的进程数目*/
if ( rank == 0 ){
senddata = 9999 ;
MPI_Send( &senddata, 1, MPI_INT, 1, tag,
MPI_COMM_WORLD ) ; /* 发送数据到进
程1 */
}
if ( rank == 1 ){
MPI_Recv( &recvdata, 1, MPI_INT, 0, tag,
MPI_COMM_WORLD, &status);
/*从进程0接收数据*/
}
MPI_Finalize() ; /*MPI的结束函数*/
return (0) ;
}
另一个例子
实现 sum( a + b ),并且把求和结果打印出来。这里 a, b 都是n维空间的向量,并且每个元素都为整数。
#include “mpi.h” /*MPI头文件*/
#include
#include
int main(argc, argv)
int argc ;
char **argv ;
{
int rank, size, i, tag = 1 ;
int *a, *b, n;
n = 100 ;
a = (int*)malloc( sizeof( int ) * n ) ;
b = (int*)malloc( sizeof( int ) * n ) ;
for(i = 0 ; i < n ; i++){
a[i] = 1 ;
b[i] = 2 ;
}
MPI_Status status ;
MPI_Init( &argc, &argv ) ; /*MPI的初始化*/
MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 总的进程数目*/
int nSize = n / size ;
MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; /*该进程的编号 */
if( rank != (size - 1) ){
int sum = 0 ;
for( i = 0 ; i < nSize ; i++ ){
sum += a[i + rank * nSize ] + b[ i + rank * nSize ] ;
}
MPI_Send( &sum, 1, MPI_INT, (size-1), tag, MPI_COMM_WORLD ) ; /* 发送求和数据到进程(size-1) */
}else{
int sum = 0, total = 0 ;
for( i = (size - 1) * nSize ; i < n ; i++ ){
sum += a[i] + b[i] ;
}
total += sum ;
for( i = 0 ; i < (size - 1) ; i++ ){
MPI_Recv( &sum, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status); /*从各个进程接收部分求和数据*/
total += sum ;
}
printf( "total = %d ", total ) ;
}
MPI_Finalize() ; /*MPI的结束函数*/
return (0) ;
}
2.1)通过MPI如何实现2个矢量相加。
/* simple.c */
#include/*MPI头文件*/
#include
#include
int main(argc, argv)
int argc ;
char **argv ;
{
int rank, size, tag = 1 ;
int *a, *b , n = 100 ;
a = (int*)malloc( sizeof( int ) * n ) ;
b = (int*)malloc( sizeof( int ) * n ) ;
int i ;
for( i = 0 ; i < n ; i++ ){
a[i] = 1 ;
b[i] = 2 ;
}
MPI_Status status ;
MPI_Init( &argc, &argv ) ; /*MPI的初始化*/
MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ; /*该进程的编号 */
MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 总的进程数目*/
int nSize = n / size ;
int sum ;
if( rank < (size -1) ){
sum = 0 ;
for( i = 0 ; i < nSize ; i++ ){
sum += a[i] + b[i] ;
}
}else{
sum = 0 ;
for( i = nSize * (size - 1) ; i < n ; i++ ){
sum += a[i] + b[i] ;
}
}
printf("cpu = %d, sum = %d ", rank, sum ) ;
MPI_Finalize() ; /*MPI的结束函数*/
return (0) ;
}
2.2)通过MPI如何实现2个矢量相乘。
#include/*MPI头文件*/
#include
#include
int main(argc, argv)
int argc ;
char **argv ;
{
int rank, size;
int n = 100 ;
int i ;
MPI_Status status ;
MPI_Init( &argc, &argv ) ;
MPI_Comm_size( MPI_COMM_WORLD, &size );
int nSize = n / size ;
MPI_Comm_rank( MPI_COMM_WORLD, &rank ) ;
int *a, *b ;
a = (int*)malloc( sizeof(int) * n ) ;
b = (int*)malloc( sizeof(int) * n ) ;
int( i = 0 ; i < n ; i++ ){
a[i] = 1 ;
b[i] = 2 ;
}
int tag = 1 ;
if( rank != (size - 1) ){
int sum = 0 ;
for( i = 0 ; i < nSize ; i++ ){
sum += a[rank * nSize + i]* b[rank * nSize + i];
}
MPI_Send( &sum, 1, MPI_INT, (size-1), tag, MPI_COMM_WORLD ) ; }else{
int sum = 0, total = 0 ;
for( i = (size - 1) * nSize ; i < n ; i++ ){
sum += a[i] * b[i];
}
total += sum ;
for( i = 0 ; i < (size - 1) ; i++ ){
MPI_Recv( &sum, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status);
total += sum ;
}
篇三:Matlab心得及学习方法
Matlab心得及学习方法(不断更新)
发现现在很多人(找工作的或者读博的)都想要学习或者正在学习Matlab,问我要怎么学习。其实我虽然写Matlab代码的经验还算丰富,但是还不能说是一个很好的Matlab编程人员,这里有一些心得,分享给大家希望对大家有所帮助。
关于如何学习Matlab
我的学习方法很简单:Matlab是练出来的,而不是看出来的。很多人问我有没有比较好的Matlab教材,我说随便找一本吧,都可以。只要书里面有最基本的语法和命令,对于一个有编程基础的人,Matlab可以在一个下午的时间内学会。当然,仅仅是学会。如果想要对Matlab比较得心应手,那么最好的办法就是练习。练习的素材很多,比如对于学经济学的,可以做一些simulation之类的,也可以试着把计量或者宏观教材里面的一些算法写写出来。一开始可能很慢,但是当你完成了一个比较大的project的时候,你的Matlab的功力将会有巨大的提升。
当然,在你写程序之前,多读一些别人写的好的code是非常有帮助的。
一些Matlab的经验
1、适当了解一些数值计算、数值分析以及最优化的理论
用Matlab的无非是做数值计算或者最优化,这也是Matlab的强项,Matlab有足够多的工具箱解决这些问题。但是在使用这些工具箱之前,应该首先了解一些数值计算以及最优化的理论。这一点在程序碰到问题或者计算结果不理想的时候尤为重要。很多时候结果不理想并不是自己的理论出了问题,而是盲目或者错误使用Matlab的.工具箱而导致的。比如我曾经做过一个单纯形法的优化程序,但是结果总是不理想,这个时候就要返回到单纯形法具体是一种什么样的算法来考虑这个问题,最后发现是由于目标函数的某一部分十分平缓导致的。 当然更重要的是如果你不理解理论,很多问题根本不知道如何处理。有个学化学同学就曾问我一个程序怎么写,说matlab肯定可以完成的。了解清楚之后才明白原来他想做的就是一个受限最小二乘。但是他不懂得什么是最小二乘(因为没怎么学过数学),当然面对这个问题无从下手。
2、理解Matlab中时间空间的转化
这个问题没有人强调,但我觉着蛮重要。这里的关键点其实很简单,就是尽量减少重复计算,哪怕是多项式复杂度以内的计算。重复计算的内容应该适时保存到内存中,以后直接调用。一个程序可能会重复运行几千次几万次,一点点的浪费时间都可能被放大很多。空间(内存)我们是可以扩充的,但是时间不是,所以绝大多数时候我们需要放弃空间,获得时间上的迅捷。
这里有个故事,曾经在某技术论坛上看到的,说腾讯公司早期做的QQ实在太过垃圾,他们追踪过QQ的行为,发现在几分钟时间里重复调用了某同一注册表项几百次。显然注册表的内容所占内存是有限的,甚至是可以忽略的,但是每次读注册表项可能都要读硬盘,这里的时间花费是很大的,为什么不把这项内容直接存储在内存里呢?
一个比较经典的例子:考虑交换两个变量a,b的值,有如下写法:
c=a;
a=b;
b=c;
或者:
a=a+b;
b=a-b;
a=a-b;
第一种写法多占了内存,因为需要多申请一个c的内存空间;第二种写法节省了内存空间,但是却多了三次计算时间。请问哪种好?不一定,看你的时间空间的权衡。但是具体到这个例子来说,第二种是不推荐的,因为:首先,第二种程序晦涩难懂,难以维护,内存不至于低到不能存储一个变量;第二,如果两个数字都特别特别大,计算a的时候会有溢出的危险。
3、形成良好的编程规范
我想几乎所有学过编程的人都被这样告诫过。比较好的是Matlab自带的编辑器本身就可以自动缩进之类的,程序十分易读。但是还有一些东西是有些人不曾注意过的。比如变量名,一个好的变量名一定要有清晰的含义,让人一看就能明白,否则日后的修改维护必然要花费更多的时间去识别这些变量名的含义。这一点可以参考http://coolshell.cn/articles/1038.html http://coolshell.cn/articles/1990.html 这里面详细列举了很多命名的规则和技巧。 还有一点就是注释。好的注释可以极大的方便以后的维护以及代码的重用。我的习惯是在代码的开头都要交代这个代码是干什么用的,怎么用等等。在程序中一个大块的功能模块也要加上注释告诉大家你在做什么。如果某个语句很复杂,可以加注释告诉大家这句到底在干什么。这样写出来的程序维护起来或者他人使用起来将非常方便。
另有一篇十分有趣的文章分享给大家:如何写出无法维护的代码 http://coolshell.cn/articles/4758.html
4、如果拿到一个任务而又没有思路,试着把问题分解或者转化。
之所以叫做程序,是因为我们所做的工作就是告诉计算机要做什么,该怎么做。所以如果你的脑子里根本不知道这个问题该怎么解决的时候,你就更加无法写出程序。找思路的一般方法是分解问题,然后逐个击破。或者在特殊情况下,需要把问题转化。
分解与转化的第一步是把实际问题转化为数学问题。这一步可能已经做好,可能没有。如果没有,那么这一步就叫做数学建模。绝大多数问题都可以转化为两类问题,一类是最优化问题,一类是求解问题。如果你能知道你在最优化什么东西或者求解什么东西,问题就简单很多。
转化问题的第二步是把数学问题转化为程序(不是代码)。也就是说,你要想清楚这个问题(最优化或者求解)是怎么一步步实现的。 这个过程可能很简单,有现成的方法用,也有可能很复杂,还可能涉及多种转化。比如我们经济学中遇到的求解动态最优化,经常要把连续的东西离散化(离散化很重要!)。
最后,考虑怎么把你的程序转化为真实的代码。这一步说简单很简单,因为只要你做好了以上两步,这一步是顺其自然的。但是当然会有很多小的细节,也许这就是所谓的technique。但是我还是觉着,学习编程不是学习technique,而是学习第二步,虽然本文关注的更多的是technique。
5、如果程序出错了,而又查不到语法的错误,使用断点
编程中最可怕的错误不是语法,而是逻辑错误,因为逻辑错误是最难debug的。一个很有用的工具就是断点。
断点应该是debug中最常用的工具。Matlab的编辑器中可以很方便的实现(在每一行的开头有个小横线,单击一下变成红点,然后就设置成断点了)。当程序运行到断点之后就会中断,然后会在主窗口显示K>>的标志,这时你可以输入命令查看内存情况等等。一步步的跟踪,直到变量值跟你的预期不一样,这时你就可以很容易的找到错误在什么地方发生了。
6、如果试了很多办法还是不能找到错误,那就尝试一下终极debug方法,适用于各种语言 真的有这么强大的debug方法么?有的!这个方法很简单,离开你的电脑,找一个人,随便什么人,说一遍你的程序的思路,说的越具体越好。多数情况下,你在阐述的过程中,程序的错误就会突然从你的大脑里冒出来了。
如果实在找不到就找大街上的乞讨人员吧,给他们十块钱他们应该很乐意听你说的,并且说不定还可以给你一些很好的建议,然后告诉你,十年前他们也在做同样的工作。
7、理解通用与专用之间的权衡
你可以写一个通用的程序,也可以写一个专用的程序,这需要你的权衡。一般情况下,专用的程序你可以研究清楚其结构,从而找到最快的算法,而通用的程序则不能达到这点,因为要考虑到很多很多特殊的情况。
比如给定一个分布函数F(x),我想要写一个随机数生成器是的生成的随机数的分布函数为F(x). 方法很简单,先生成一个均匀分布的随机数a,是的a~U(0,1),然后计算F的反函数在a处的值。很多人可能会用fsolve之类的办法,但是这不是最快的。如果我们已经知道F是一个单增的函数,那么这个解有且仅有一个。这样我们就可以直接使用一些算法去解决他。 类似的问题还有如果我们知道导数,那么求最优化最好的方法也许是牛顿法,而不是用单纯形法去寻找,那样既不精确又慢
但是通用的程序也是非常吸引人的,因为可以大大的减少开发的时间,如果计算时间不是首要考虑的问题的话。
8、尽量使你的程序更通用
也就是说,尽量使你的代码能被重复利用。这样可以节省很多写程序的时间,而你发现这些东西都是你写过很多遍的。
很多人没有一个写通用程序的好的习惯。比如说下面一个最简单的例子:
x=randn(10000,1);
y2=zeros(10000 ,1);
for i=1: 10000
y2(i)=exp(x(i));
end
这样写的问题在于,如果你的x需要改变了,比如改成100维,那么你需要修改不止一次。但是如果你写成这样:
x=randn(10000,1);
y2=zeros(length(x),1);
for i=1:length(x)
y2(i)=exp(x(i));
end
那么是不是仅仅修改一个地方就可以了呢?
9、尽量使你的程序模块化
把需要重复进行的程序尽量写成函数,便于修改和维护。写成函数的好处是使你在同一时间只关注一个问题,但是如果你把所有的东西都放在一个程序里,你可能需要考虑的问题就不止一个了。
10、在使用变量之前先进行声明,尽量少使用矩阵变维操作
这不是matlab必须的,但是是十分建议的。比如如果你写下了如下的代码:
for i=1:10000
y=y+i;
end
你没有声明y,而是直接试用了它,很可能会出现问题。比如你的内存里之前已经有y,y=10,那么你的计算结果是不是会大10呢?更有可能的情况是你之前已经运行了这个程序,但是你的开头没有clear(开头使用clear也是很好的习惯)
此外,尽量少使用矩阵变维的操作。因为每次声明变量或者矩阵变维,Matlab总要申请一个新内存空间,频繁进行变维操作会很快侵蚀掉你的内存空间,这点在大矩阵的时候特别重要。
11、计算尽量多的使用矩阵,尽量少的使用循环
循环的好处是比较容易想,比较容易些,但是也比较难以维护,最重要的,速度很慢。 比如下面一个例子:
x=randn(10000,1);
tic
y1=exp(x);
toc
tic
y2=zeros(length(x),1);
for i=1:length(x)
y2(i)=exp(x(i));
end
toc
输出结果:
Elapsed time is 0.000287 seconds.
Elapsed time is 0.000963 seconds.
可见使用矩阵比使用循环快了三倍。
12、如果进行大量的重复操作,可以考虑使用并行计算
比如在做Monte Carlo模拟的时候,你的每次循环都是独立的(每次循环不影响下一次循环的结果),那么可以考虑使用并行处理,如果你的电脑是多核的。
首先,你要用以下命令创建几个并行的进程:
matlabpool local 4
其中4是你的计算机核心数。然后,使用parfor代替for循环就可以了。但是使用这个命令一定要注意使用前提和不要每次循环访问同样的可变的变量。
13、尽量少的涉及符号运算
Matlab最强大的是其数值运算能力,而不是符号运算。如果你需要处理诸如求导求极限之类的工作,用Mathematica或者Maple。特别是尽量少的使用符号定义的函数,比如用fsolve之类的,如果只是计算一次两次非常方便,但是如果进行大量重复的此类运算,其速度很慢,最好研究清楚要解的函数的性质,用专门的算法进行处理,matlab大多数时候也有专门的工具箱。
篇四:多核
多核的概念是什么?多CPU是多核吗?机群是多核吗?
多核是片上多处理器的的俗称,是指将多个处理器集成到一个芯片中的技术。
多CPU不是多核,机群也不是多核。
并行计算机的概念是什么?
1.由一组处理单元组成。
2.各处理单元之间相互通信与协作。
3.以更快的速度共同完成一项大规模计算任务。
弗林将计算机分为哪几类?冯·诺依曼计算机机属于哪类?支持SSE指令集的Intel处理器属于哪类?多核、多CPU、机群都属于哪类?
SISD:单指令单数据流
SIMD:单指令多数据流
MISD:多指令单数据流
MIMD:多指令多数据流
冯·诺依曼计算机机属于
支持SSE指令集的Intel处理器SIMD
多核,多CPU,机群属于MIMD。
多核、多处理器系统与多计算机系统有什么区别?
多核、多处理器系统:多个核心共享内存。
多计算机系统:每个节点有独立内存。
多核与多处理器的区别:
1.多核之间可能共享cache,多处理器间不共享。
2.多核间通过片上总线相连,多处理器间通过系统总线相连。
3.多核在尺寸功耗方面具有优势,两者编程优化也有所不同。
按地址组织模式的不同,当前主流并行计算机可以分为哪几类,各有什么特点?SMP、DSM、MPP、Cluster分别属于哪类?
1均匀访存(共享存储):所有核心平等访存,时间相同。
2.分布式共享存储(DSM):每个节点有局部内存,内存空间统一编制,每个节点可以高速访问局部内存,低速访问其他节点局部内存。
3.分布式(局部)访问:节点只能访问局部内存,与其他节点传递信息通过消息完成。 SMP:(对称多处理器)采用商品化的处理器,这些处理器通过总线或交叉开关连接到共享存储器。每个处理器可等同地访问共享存储器、I/O设备和操作系统服务。共享节点称为系统瓶颈,扩展性有限。属于均匀访存类。
DSM:(分布共享存储并行机)存储器物理上分布在不同的节点中,但通过硬件和软件方法实现内存的统一编制。属于分布式共享存储。
MPP:(大规模并行机)处理节点采用商品微处理器,能扩展至上万个处理器。采用高通信带宽和低延迟的互联网络。各个进程有自己的地址空间,进程间通信消息传递相互作用。由分布式操作系统管理。属于分布式(局部)访问。
Cluster:(机群)每个节点是一个完整的计算机,有自己的磁盘和操作系统。通过商用互连网络连接。运行分布式程序,完成并行计算。属于分布式(局部)访问。
指令级并行有什么特点?
有两种技术:流水线技术和多发射技术。
流水线技术:分解指令执行步骤,让前后指令的步骤重叠执行;后续指令可以超越前面的指令执行。
多发射技术:流水线上每个功能部件都能同时执行多条指令。
特点:并行由同一控制器控制,主要由硬件和编译器支持,对高级语言程序员可以保持透明。
多核架构的分类方法有两种?每种下面有哪些分类?IBM的Cell处理器属于何种架构? 按核之间关系分类:同构;异构
按存储结构分:独占cache;共享cache。
IBM的Cell处理器属于
多核在硬件设计上面临哪些问题?
1.如何让组织核心,设计架构,同构?异构?
2.如何保证cache的一致性。
3.如何满足多核所需的总线带宽。
支持多核的操作系统,有哪几种任务调度方法,各有什么特点?
1.主从模式:有一个核负责分配任务,其他核执行,主处理器称为系统瓶颈。
2.共享队列:进程在核间切换严重降低性能,进程队列需加锁,造成等待。
3.独占队列:负载有可能不均衡。
什么是数据相关性?
两个操作(指令)访问同一内存单元,且其中至少有一个写内存操作。
顺序一致性对程序执行顺序的要求是什么?
访存操作先开始的先执行,不论访存指令是在哪个处理器上执行的。
弱一致性与顺序一致性的区别是什么?释放一致性与弱一致性的区别是什么?
顺序一致性:对所有的访存操作要求顺序
弱一致性:有的访存操作可以乱序,但同步操作下,必须要求顺序。(引用同步操作实现独占共享单元)
释放一致性:将同步操作分为获取和释放两种。获取操作时,需要将先前对内存的改写完成;释放操作时,应保证对共享单元的改写能够彻底完成。
在Cache一致性协议中,当发生改写时,有哪两种处理方式,各有什么优缺点?
1.写使无效
优点:改写数据的处理器可以独占该数据,直到其他处理器改写该数据。
缺点:无效cache会引起cache不命中,如果多个处理器频繁改写同一数据,会造成cache不命中频繁发生(乒乓效应)。
2.写更新
优点:cache中的备份一直保持有效。
缺点:数据广播需要带宽较高。
进程有哪些要素?线程之间共享了哪些进程的要素?
1.独立的指令流与数据
2.硬件上下文:程序运行时寄存器的状态。
3.地址空间:可以由进程访问的线性(虚拟)地址的集合
4.资源:文件,设备,中断
独占指令流和硬件上下文;地址空间和资源
为什么进程切换的效率低于线程切换?
进程切换:更易引起cache和tlb的失效。(tlb页表缓存)
线程切换:不易引起以上两个问题,共享进程地址空间,只修改寄存器和硬件上下文。
简述使用系统API创建线程的步骤。Win32下有哪几种方式可以结束线程?
1.声明线程回调函数
2.通过API函数向系统注册回调函数
3.操作系统调用回调函数执行
结束线程:
1.主动退出
2.Main函数退出
3.强制退出(调用系统函数退出其他线程)
在Win32下有哪几种典型同步工具,各有什么特点?
Linux下的同步工具读写锁有什么特点?
什么是线程安全性?如何判断函数的线程安全性?
阿姆达尔定律的主要内涵是什么?
如何解决多线程负载不均衡的问题?
什么是乒乓效应,如何解决?
篇五:fluent6.3多核调用方法
如果是FLUENT 6.3 之类的版本一定要按下面命令操作,否则运算时仅仅相当于单核运算。现在多核机器已经非常普及,所以掌握多核并行运行方法非常必要。
开始->运行 里输入: X:Fluent.Inc tbin tx86fluent.exe 3d -t2 后面的"-t2"表示双核、四核用"-t4",依此类推
本机输入后,界面显示:
Loading "D:Fluent.Incfluent6.3.26libfl114.dmp"
Done.
Warning: -path flag not specified.
Defaulting to -pathD:Fluent.Inc
Welcome to Fluent 6.3.26
Copyright 2006 Fluent Inc.
All Rights Reserved
Done.
Loading "D:Fluent.Incfluent6.3.26libflprim1119.dmp"
Host spawning Node 0 on machine "TONY" (ntx86).
You can click CTRL+C to stop the startup process!
------------------------------------------------------------------------------ ID Comm. Hostname
O.S. PID Mach ID HW ID Name
------------------------------------------------------------------------------
host net TONY Windows-32 3660 0 1844 Fluent Host
n1 mpich2 TONY Windows-32 3448 0 1 Fluent Node
n0* mpich2 TONY Windows-32 4028 0 0 Fluent Node ------------------------------------------------------------------------------
如果是AMD处理器在XP环境下运行,请不要忘记给系统打上多核补丁以提高运算效率。
【学习方法多核诊断题】相关文章:
学校诊断报告11-14
社区诊断报告12-11
开放性应用题的学习方法总结01-23
教学诊断与改进方案10-07
办理医疗诊断证明范文06-24
疾病诊断证明书11-11
诊断证明书怎么写11-11
临床医学检测及诊断的论文10-08
对遗传学诊断的分析论文10-10
人力资源诊断分析报告10-30