已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、程序的功能2二、程序的主要流程3三、程序的主要数据结构5四、程序的模块64.1 词法分析模块64.2 负载模块84.2.1 参数介绍104.2.2 重要变量134.2.3 任务偏移值的产生(rankOffset)134.2.5 测试文件的命名154.2.6 TestIoSys函数的简要注释说明174.2.7 ReduceIterResults函数的简要注释说明214.2.8 SummarizeResults函数的简要注释说明234.2.9 WriteOrRead函数的简要注释说明254.3 底层函数模块284.3.1 IOR_Xfer_POSIX函数的简要注释说明28五、总结305.1 IOR的优点305.2 IOR的缺点305.3 如何修改IOR30六、附录316.1 每个文件的作用和信息316.2重要的数据结构326.3 每个c文件所包含的函数346.3.1 Parse_options.c中的函数346.3.2 utilities.c中的函数366.3.3 aiori-POSIX.c中的函数386.3.4 aiori-MPIIO.c中的函数396.3.5 aiori-HDF5.c中的函数396.3.6 aiori-NCMPI.c中的函数396.3.7 IOR.c中的函数39一、 程序的功能IOR是测试基准程序,它的功能是接受参数,在client上产生特定的负载,测试系统的系能,并输出测试结果。根据IOR的功能,可以把IOR程序分成三个模块:词法分析模块、负载模块、底层函数模块。输入的参数有三种形式: 选项形式-比如 “-w r f c Z” 等 赋值形式,在-O选项后面赋值,比如“ O api=POSIX” 配置脚本形式,在配置脚本中,给参数结构体IOR_param_t成员赋值,形式如 “f script.txt”使用配置脚本形式,可以设置几次测试,每次测试的参数都不一样。IOR能模拟不同的负载,所以负载模块很复杂,其中最重要的函数TestIoSys()有400+行代码。在TestIoSys()有许多条件语句,根据参数结构体IOR_param_t里成员的值,产生不同操作。修改IOR,减少不必要的参数,增加读写比例参数,就需要修改结构体IOR_param_t,和修改TestIoSys()函数。二、 程序的主要流程简略分析main函数流程,下面是main函数的不完全代码:int main(int argc, char * argv) IOR_queue_t * tests; /*IOR_queue_t是参数结构体IOR_param_t的链表结构*/ tests = SetupTests(argc,argv); /*接受参数设置,并检查参数,然后填充参数结构体*/ While(tests != NULL) TestIoSys(&tests-testParameters); /*根据参数结构体的成员,进行测试*/ test = test-nextTest; /*下一个测试*/ ParseCommandLine/词法分析命令参数,并填充参数结构体DistributeHints/把环境变量分发到各个进程VaildTests/检查各个参数结构体内的参数是否有效TimeDeviation /检查每个任务之间开始时间的偏差SeedRandGen/产生随机数ShowTest/显示参数信息AioriBind/装填I/O接口ShowSetup/显示设置信息SummarizeResults/显示测试结果Time0/定时器伪代码ReduceIterResults/归约操作,计算结果三、 程序的主要数据结构两个重要的数据结构是:aiori.h中定义的参数结构体IOR_param_t。用来填充参数。IOR.h中定义的参数结构体队列IOR_queue_t。运行一次程序可以执行几次参数不同的测试。typedef struct char debugMAX_STR; /* debug info string */ unsigned int mode; /* file permissions */ unsigned int openFlags; /* open flags */ int TestNum; /* test reference number */ char apiMAX_STR; /* API for I/O */ int numTasks; /* number of tasks for test */ int nodes; /* number of nodes for test */ int tasksPerNode; /* number of tasks per node */ int repetitions; /* number of repetitions of test */ . int readFile; /* read of existing file */ int writeFile; /* write of file */ . int keepFile; /* dont delete the testfile on exit */./* POSIX variables */int singleXferAttempt; /* do not retry transfer if incomplete */int fsYncPerWrite; /* fsync() after each write */int fsync; /* fsync() after write */* MPI variables */MPI_Datatype transferType; /* datatype for transfer */MPI_Datatype fileType; /* filetype for file view */* HDF5 variables */int individualDataSets; /* datasets not shared by all procs */int noFill; /* no fill in file creation */IOR_offset_t setAlignment; /* alignment in bytes */* NCMPI variables */int var_id; /* variable id handle for data set */* Lustre variables */int lustre_stripe_count;int lustre_stripe_size;int lustre_start_ost;int lustre_ignore_locks; IOR_param_t;typedef struct IOR_queue_t IOR_param_t testParameters; struct IOR_queue_t * nextTest; IOR_queue_t;四、 程序的模块4.1 词法分析模块该模块包含的C文件有Parse_options.c该文件包括defaults.h头文件,defaults.h头文件是一个参数结构体defaultParameters的定义,该结构体包含默认的参数值。Parse_options.c包含5个主要函数,如下表所示。函数名功能ParseCommandLine对命令行参数进行词法分析ParseLine对一行字符串调用DecodeDirective函数进行词法分析ReadConfigScript读取配置脚本,分配并填充参数结构体DecodeDirective分析诸如“transferSize=64k”一样的偶对,并给参数结构体中的transferSize赋值。CheckRunSettings检查和纠正每次测试参数的参数值。1.参数结构体中的writeFile、readFile、checkWrite、checkRead值为FALSE时,设置readFile和writeFile的值为TRUE。2.当参数结构体中的numTasks为0时,设置numTasks=MPI进程数ParseCommandLine函数是词法分析模块的最主要的函数,它和其他函数的关系如下图小结:参数的输入形式有三种,但对于我们编写的聚合带宽程序只需要一种输入形式,即命令行形式。所以我们只使用ParseCommandLine函数,其他函数可以删除。4.2 负载模块该模块包含的C文件有IOR.Cutilities.cIOR.C文件中有主函数main,SetupTests函数,TestIOSys函数,WriteOrRead函数负载模块的函数关系图如下:4.2.1 参数介绍编号参数参数作用描述所对应的参数结构体成员成员类型默认值重要程度1-A # 测试标志,可以在输出结果上显示,作为标记。test reference number for easier test identification in log filesTestNum数值-12-a POSIX|MPIIOAPI接口选项api字符串POSIX重要3-b #数据块大小blockSize数值1048576重要4-B用于POSIX接口,使用直接I/O,不使用I/O缓存。useO_DIRECT布尔0一般5-c聚合(collective)I/O,MPI的文件操作为组调用collective布尔0一般6-C读操作时,读取其他任务所写的文件。所有任务的任务偏移量是常量。reorderTasks布尔0一般7-Q #任务偏移量,用于-C Z选项taskPerNodeOffset数值1一般8-Z所有任务的任务偏移量不是常量,是随机产生的。reorderTasksRandom布尔0一般9-X #与-Z选项一起使用。当0时,每次循环的随机种子都一样,当numTasks任务所写的文件。以下代码是TestIoSys函数中的部分代码,作用是产生任务偏移值/*读文件,并在每次I/O操作间计时。*/if (test-readFile & (maxTimeDuration ? (GetTimeStamp() - startTime reorderTasks)rankOffset = (test-taskPerNodeOffset*test-tasksPerNode) % test-numTasks; /* 当设置-Z Q (-X)选项时,产生的任务偏移值是随机的*/if (test-reorderTasksRandom) /*以下操作不会与文件偏移值(-Z选项)冲突,因为GetOffsetArrayRandom函数产生文件偏移值 */int *rankoffs, *filecont, *filehits, ifile, jfile, nodeoffset;unsigned int iseed0;nodeoffset = test-taskPerNodeOffset;nodeoffset = (nodeoffset nodes) ? nodeoffset : test-nodes-1;iseed0= (test-reorderTasksRandomSeed reorderTasksRandomSeed+rep):test-reorderTasksRandomSeed; srand(rank+iseed0); rankOffset = rand() % test-numTasks; while (rankOffset tasksPerNode) rankOffset = rand() % test-numTasks; 4.2.5 测试文件的命名每个任务调用GetTestFileName函数就能得到测试文件的文件名。测试文件的文件名与参数结构体变量中成员(filePerProc、uniqueDir、multiFile、repCounter)有关。以下是GetTestFileName的源代码:void GetTestFileName(char * testFileName, IOR_param_t * test) char * fileNames, initialTestFileNameMAXPATHLEN, testFileNameRootMAX_STR, tmpStringMAX_STR; int count; strcpy(initialTestFileName, test-testFileName); fileNames = ParseFileName(initialTestFileName, &count);/*1*/ if (count 1 & test-uniqueDir = TRUE)/*2*/ERR(cannot use multiple file names with unique directories);if (test-filePerProc) /*3*/ strcpy(testFileNameRoot, fileNames(rank+rankOffset)%test-numTasks) % count); /*4*/else strcpy(testFileNameRoot, fileNames0); /*5*/ /* give unique name if using multiple files */if (test-filePerProc) /*6*/ /* prepend rank subdirectory before filename, e.g., /dir/file = /dir/file*/if (test-uniqueDir = TRUE) /*7*/ strcpy(testFileNameRoot, PrependDir(test, testFileNameRoot); /*8*/ sprintf(testFileName, %s.%08d, testFileNameRoot, (rank+rankOffset)%test-numTasks); /*9*/ else strcpy(testFileName, testFileNameRoot);/*10*/ /* add suffix for multiple files */if (test-repCounter -1) /*11*/ sprintf(tmpString, .%d, test-repCounter);strcat(testFileName, tmpString);/*12*/ /* GetTestFileName() */为了便于分析,我们设num=(rank+rankOffset)%test-numTasks。在第1行中,ParseFileName函数对参数结构体中成员testFileName进行词法分析,比如当testFileName=”/tmp/myfs/mnt/testfs/mnt/nfs”时,fileNames0=” /tmp/myfs”, fileNames1=” /mnt/testfs”, fileNames2=” /mnt/nfs”。第8行中,PrependDir函数能把”/mnt/testfs”变成”/mnt/testfs”。第11行中,当设置-m选项时,即参数结构体成员multiFile被设置为1时,给测试文件名加上后缀,后缀是循环序号。当count=1时,testFileName=” /mnt/testfs”,各个任务的测试文件名如下:count=1uniqueDir=1uniqueDir=0filePerProc = 1multiFile=1/mnt/testfs./mnt/testfs.multiFile=0/mnt/testfs./mnt/testfs.filePerProc = 0(Single shared file)multiFile=1/mnt/testfs.multiFile=0/mnt/testfs4.2.6 TestIoSys函数的简要注释说明void TestIoSys(IOR_param_t *test) char testFileNameMAX_STR; double * timer12; double startTime; int i, rep, maxTimeDuration; void * fd; MPI_Group orig_group, new_group; int range3;IOR_offset_t dataMoved; /* for data rate calculation */*创建测试所需要的通信域(MPI)*/*求出每个节点的任务数*/test-tasksPerNode = CountTasksPerNode(test-numTasks, testComm);/*初始化计时数组*/*初始化每次循环用于保存结果的数组*/*bind I/O calls to specific API */AioriBind(test-api);/*计算聚合文件的大小*/for (rep = 0; rep repetitions; rep+) test-aggFileSizeFromCalcrep = test-blockSize * test-segmentCount * test-numTasks;/*记录开始时间*/startTime = GetTimeStamp();/*循环测试,每个循环中有四种主要操作:写文件、检查写、读文件、检查读*/for (rep = 0; rep repetitions; rep+) /*每次循环测试由任务0记录开始时间,并向所有任务广播*/* 使用循环序号作为测试文件名的一部分,影响GetTestFileName 函数的结果*/ if (test-multiFile) test-repCounter = rep;/*写文件,并计时*/if (test-writeFile)GetTestFileName(testFileName, test);DelaySecs(test-interTestDelay);if (test-useExistingTestFile = FALSE) RemoveFile(testFileName, test-filePerProc, test); MPI_CHECK(MPI_Barrier(testComm), barrier error); test-open = WRITE; timer0rep = GetTimeStamp(); fd = IOR_Create(testFileName, test); timer1rep = GetTimeStamp(); if (test-intraTestBarriers)MPI_CHECK(MPI_Barrier(testComm), barrier error); timer2rep = GetTimeStamp(); dataMoved = WriteOrRead(test, fd, WRITE); timer3rep = GetTimeStamp(); if (test-intraTestBarriers)MPI_CHECK(MPI_Barrier(testComm), barrier error); timer4rep = GetTimeStamp(); IOR_Close(fd, test);timer5rep = GetTimeStamp(); MPI_CHECK(MPI_Barrier(testComm), barrier error); /* get the size of the file just written */ test-aggFileSizeFromStatrep = IOR_GetFileSize(test, testComm, testFileName); /* check if stat() of file doesnt equal expected file size, use actual amount of byte moved */ CheckFileSize(test, dataMoved, rep);ReduceIterResults(test, timer, rep, WRITE); if (test-outlierThreshold) CheckForOutliers(test, timer, rep, WRITE); /*if writeFile*/*检查写操作*/if (test-checkWrite) MPI_CHECK(MPI_Barrier(testComm), barrier error);if (test-corruptFile) CorruptFile(testFileName, test, rep, WRITECHECK); MPI_CHECK(MPI_Barrier(testComm), barrier error); if (test-reorderTasks) rankOffset = (2*test-tasksPerNode) % test-numTasks;GetTestFileName(testFileName, test); test-open = WRITECHECK; fd = IOR_Open(testFileName, test); dataMoved = WriteOrRead(test, fd, WRITECHECK); IOR_Close(fd, test);rankOffset = 0;/*读文件,并计时*/if (test-readFile)/*产生任务偏移值*/GetTestFileName(testFileName, test);DelaySecs(test-interTestDelay); MPI_CHECK(MPI_Barrier(testComm), barrier error); test-open = READ; timer6rep = GetTimeStamp(); fd = IOR_Open(testFileName, test); timer7rep = GetTimeStamp();if (test-intraTestBarriers)MPI_CHECK(MPI_Barrier(testComm), barrier error);timer8rep = GetTimeStamp(); dataMoved = WriteOrRead(test, fd, READ); timer9rep = GetTimeStamp();if (test-intraTestBarriers)MPI_CHECK(MPI_Barrier(testComm), barrier error); timer10rep = GetTimeStamp(); IOR_Close(fd, test); timer11rep = GetTimeStamp(); test-aggFileSizeFromStatrep = IOR_GetFileSize(test, testComm, testFileName);CheckFileSize(test, dataMoved, rep); ReduceIterResults(test, timer, rep, READ); if (test-outlierThreshold) CheckForOutliers(test, timer, rep, READ); /*if readFile */*检查写操作*/if (test-checkRead) MPI_CHECK(MPI_Barrier(testComm), barrier error);if (test-reorderTasks) rankOffset = (3*test-tasksPerNode) % test-numTasks;GetTestFileName(testFileName, test); MPI_CHECK(MPI_Barrier(testComm), barrier error); test-open = READCHECK; fd = IOR_Open(testFileName, test); if (test-filePerProc) int tmpRankOffset; tmpRankOffset = rankOffset; if (test-reorderTasks) rankOffset = (4*test-tasksPerNode) % test-numTasks; GetTestFileName(test-testFileName_fppReadCheck, test); rankOffset = tmpRankOffset; test-fd_fppReadCheck = IOR_Open(test-testFileName_fppReadCheck, test); dataMoved = WriteOrRead(test, fd, READCHECK); if (test-filePerProc) IOR_Close(test-fd_fppReadCheck, test); test-fd_fppReadCheck = NULL; IOR_Close(fd, test); /*if readCheck*/MPI_CHECK(MPI_Barrier(testComm), barrier error);if (!test-keepFile & !(test-keepFileWithError & test-errorFound)RemoveFile(testFileName, test-filePerProc, test);test-errorFound = FALSE;MPI_CHECK(MPI_Barrier(testComm), barrier error);rankOffset = 0;/*for rep=0*/*统计结果*/SummarizeResults(test);/*释放内存*/*TestIoSys*/4.2.7 ReduceIterResults函数的简要注释说明在每次读/写文件后,都调用ReduceIterResults函数进行归约操作,统计计算读/写速度和读/写时间。以下是ReduceIterResults函数的部分源代码。void ReduceIterResults(IOR_param_t * test, double * timer, int rep, int access) double reduced12 = 0 , diff6, currentWrite, currentRead, totalWriteTime, totalReadTime; enum RIGHT, LEFT; int i; static int firstIteration = TRUE; IOR_offset_t aggFileSizeForBW; MPI_Op op; /* 找出每个奇数定时器中的最小值,找出每个偶数定时器中的最大值。因为奇数定时器记录的是开始时间,偶数定时器记录的是结束时间*/ for (i = 0; i 12; i+) op = i % 2 ? MPI_MAX : MPI_MIN; MPI_CHECK(MPI_Reduce(&timerirep, &reducedi, 1, MPI_DOUBLE, op, 0, testComm), MPI_Reduce(); if (rank = 0) /* 计算读/写时间和吞吐量 */ for (i = 0; i aggFileSizeForBWrep;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 船舶动力装置专业知识与实践技能试题及答案
- Bz-VGR-AMC-生命科学试剂-MCE
- BTK-IN-21-生命科学试剂-MCE
- Boc-pyrrolidine-cyclopentanamine-生命科学试剂-MCE
- 纺织染色机操作工岗前基础操作考核试卷含答案
- 电气设备点检员岗前全能考核试卷含答案
- 高炉炼铁工岗前基础实操考核试卷含答案
- 模铸工安全知识竞赛评优考核试卷含答案
- 广告合规审查员岗前生产安全培训考核试卷含答案
- 不锈钢真空容器制作工创新意识知识考核试卷含答案
- 第二单元 专题学习活动 绿水青山低碳生活教学课件 2025-2026学年语文统编版八年级下册
- 码头公司绩效考核制度
- 2026年河南应用技术职业学院单招职业适应性测试题库有答案解析
- 新版《公司安全隐患整改通知单(模板)》
- 彩票管理条例培训课件
- 老年认知障碍患者AI照护的特殊伦理考量
- 广西机场管理集团有限责任公司招聘笔试题库2026
- 航运公司船舶维护与管理指南
- EB病毒感染防治指南(2025年版)
- 中考物理电学实验专题三年2023-2025中考真题分类汇编原卷版
- 2026年高速铁路工程的地质勘察要点
评论
0/150
提交评论