Tag: 并行处理

使用OpenMP并行循环

我有一个非常大的数据文件,该数据文件中的每条记录有4行。 我编写了一个非常简单的C程序来分析这种类型的文件并打印出一些有用的信息。 该计划的基本理念是这样的。 int main() { char buffer[BUFFER_SIZE]; while(fgets(buffer, BUFFER_SIZE, stdin)) { fgets(buffer, BUFFER_SIZE, stdin); do_some_simple_processing_on_the_second_line_of_the_record(buffer); fgets(buffer, BUFFER_SIZE, stdin); fgets(buffer, BUFFER_SIZE, stdin); } print_out_result(); } 这当然会遗漏一些细节(健全/错误检查等),但这与问题无关。 该程序工作正常,但我正在使用的数据文件是巨大的。 我想我会尝试通过使用OpenMP并行化循环来加速程序。 但是,经过一些搜索后,OpenMP似乎只能处理事先知道迭代次数的循环。 由于我事先并不知道文件的大小,甚至像wc -l这样的简单命令需要很长时间才能运行,我该如何并行化这个程序呢?

是否可以在OpenCL中并行运行和计算?

我是OpenCL的新手。 但是,我理解C / C ++基础知识和OOP。 我的问题如下:是否有可能并行运行和计算任务? 理论上可行吗? 下面我将描述我尝试过的事情: 例如,任务是: double* values = new double[1000]; //let’s pretend it has some random values inside double sum = 0.0; for(int i = 0; i < 1000; i++) { sum += values[i]; } 我在OpenCL内核中尝试做的事情(我觉得这是错误的,因为它可能同时从不同的线程/任务访问相同的“sum”变量): __kernel void calculate2dim(__global float* vectors1dim, __global float output, const unsigned int count) { int i […]

指令级并行探索

我只是想知道是否有任何有用的工具允许我在一些算法中利用指令级并行。 更具体地说,我有一个来自多媒体领域的算法子集,我想知道在这个算法中利用ILP的最佳方法是什么。 所有这些算法都是用C实现的,所以理想情况下我将这些算法作为输入提供给某个工具,它告诉我哪些指令可以并行执行。 非常感谢任何要点! 罗伯特

Peterson的算法对各种优化标志的行为

我想检查gcc和icc的行为以获得各种优化选项。 采用彼得森的2线程互斥算法。 如果交换了lock方法中第a行和第b行(在注释中)的执行顺序,则此算法可能会失败。 使用icc或带有-O0标志的gcc进行编译会产生正确的结果。 使用带有-O3标志的icc进行编译会产生不正确的结果。 使用带有-O3标志的gcc进行编译不会产生任何结果。 程序挂起。 所以我的猜测是-O3标志,gcc和icc都优化了锁定方法,并假设线a和线b之间没有依赖关系。 因此两者产生了错误的结果 这样的依赖很难让编译器找到,所以有没有办法(像ivdep这样的编译器)告诉编译器特定代码块中的依赖关系,这样我们仍然可以在代码的其他部分使用-O3标志 锁定方法: void lock(int me) { int other; other = 1-me; flag[me] = 1; //Line a victim = me; //Line b while(flag[other]==1 && victim == me) { } } 如果交换了行a和行b的执行顺序,则为MUTEX违规的示例: T0 0 sets victim=0 T1 1 sets victim=1 T2 1 sets flag[1]=1 T3 1 checks flag[0]. […]

mpi.h:使用不定义它的类型?

我正在尝试将OpenMPI的mpi.h的重要部分翻译成D编程语言,所以我可以从D调用它。(HTOD根本不起作用。)我无法围绕下面的代码包围: typedef struct ompi_communicator_t *MPI_Comm; OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_world; OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_self; OMPI_DECLSPEC extern struct ompi_communicator_t ompi_mpi_comm_null; 问题是ompi_communicator_t永远不会在mpi.h中定义,而mpi.h除了stddef.h之外不包含任何其他文件,它显然不包含定义。 (评论说它包含在ptrdiff_t 。)这些是mpi.h中唯一包含字符串ompi_communicator_t 。 这个结构的定义来自哪里? 有什么技巧我应该知道哪些类型可以凭空出现? (还有其他几种结构,但这是我偶然发现的第一个结构。)

将2Darrays的分布式块发送到MPI中的根进程

我有一个2D数组,它分布在MPI流程网格中(本例中为3 x 2个流程)。 数组的值是在分发该数组块的进程中生成的,我想在根进程中将所有这些块聚集在一起以显示它们。 到目前为止,我有以下代码。 这会生成一个笛卡尔通信器,找出MPI过程的坐标,并根据它计算出它应该得到多少数组(因为数组不需要是笛卡尔网格大小的倍数)。 然后我创建一个新的MPI派生数据类型,它将整个进程子数组作为一个项发送(也就是说,每个进程的步幅,块长度和计数都不同,因为每个进程都有不同大小的数组)。 但是,当我和MPI_Gather一起收集数据时,我遇到了分段错误。 我想这是因为我不应该在MPI_Gather调用中使用相同的数据类型来发送和接收。 数据类型适用于发送数据,因为它具有正确的计数,步幅和块长度,但当它到达另一端时,它将需要一个非常不同的派生数据类型。 我不确定如何计算此数据类型的参数 – 有没有人有任何想法? 另外,如果我从完全错误的角度接近这个,请告诉我! #include #include #include #include int main(int argc, char ** argv) { int size, rank; int dim_size[2]; int periods[2]; int A = 2; int B = 3; MPI_Comm cart_comm; MPI_Datatype block_type; int coords[2]; float **array; float **whole_array; int n = 10; int […]

使用omp_set_num_threads()设置线程数为2,但是omp_get_num_threads()返回1

我有使用OpenMP的以下C / C ++代码: int nProcessors=omp_get_max_threads(); if(argv[4]!=NULL){ printf(“argv[4]: %s\n”,argv[4]); nProcessors=atoi(argv[4]); printf(“nProcessors: %d\n”,nProcessors); } omp_set_num_threads(nProcessors); printf(“omp_get_num_threads(): %d\n”,omp_get_num_threads()); exit(0); 如您所见,我正在尝试根据命令行传递的参数设置要使用的处理器数量。 但是,我得到以下输出: argv[4]: 2 //OK nProcessors: 2 //OK omp_get_num_threads(): 1 //WTF?! 为什么omp_get_num_threads()返回2?!!! 正如已经指出的那样,我在串行区域中调用omp_get_num_threads() ,因此函数返回1 。 但是,我有以下并行代码: #pragma omp parallel for private(i,j,tid,_hash) firstprivate(firstTime) reduction(+:nChunksDetected) for(i=0;i<fileLen-CHUNKSIZE;i++){ tid=omp_get_thread_num(); printf("%d\n",tid); int nThreads=omp_get_num_threads(); printf("%d\n",nThreads); … 哪个输出: 0 //tid 1 //nThreads – this should […]

MPI_Bcast在if语句中?

我正在尝试MPI,当我在命令行上通过mpirun运行它时,我一直收到此错误。 ———————————————————————————————- mpirun noticed that the job aborted, but has no info as to the process that caused that situation. ———————————————————————————————- 我不确定为什么,因为其他mpi程序运行完全正常。 这是我的代码。 #include #include int func(int num){ int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (num == 0){ num = 5; MPI_Bcast(&num, 1, MPI_INT, rank, MPI_COMM_WORLD); } return num; } int main(int argc, char **argv){ int rank, […]

OpenMP – 为什么比较次数会减少?

我有以下算法: int hostMatch(long *comparisons) { int i = -1; int lastI = textLength-patternLength; *comparisons=0; #pragma omp parallel for schedule(static, 1) num_threads(1) for (int k = 0; k <= lastI; k++) { int j; for (j = 0; j i) i = k; } return i; } 更改num_threads我得到以下比较数的结果: 01 = 9949051000 02 = 4992868032 04 = […]

最适合“块分解”的MPI_Datatype?

在Jonathan Dursi和osgx的帮助下 ,我现在已经完成了进程中的“行分解”: 行http://img535.imageshack.us/img535/9118/ghostcells.jpg 现在,我想尝试“块分解”方法(如下图所示): 阻止http://img836.imageshack.us/img836/9682/ghostcellsblock.jpg 应该怎么做呢? 这次, MPI_Datatype是必要的,对吧? 哪种数据类型最合适/易于使用? 或者它可以在没有数据类型的情况下完成吗?