Tag: 并行处理

MPI意外输出

我正在阅读和练习教程中的MPI程序。 在那里,我看到了一个寻找流程等级的例子。 但同样的例子是在我的机器上给出不同的输出(Ubuntu 10.04)..这是程序 #include #include main(int argc, char **argv) { int ierr, num_procs, my_id; ierr = MPI_Init(&argc, &argv); /* find out MY process ID, and how many processes were started. */ ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id); ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs); printf(“Hello world! I’m process %i out of %i processes\n”, my_id, num_procs); ierr = MPI_Finalize(); } […]

MPI基本示例不起作用

我试图理解以下示例的含义: #include “mpi.h” #include int main(int argc, char *argv[]) { int numtasks, rank, dest, source, rc, count, tag = 1; char inmsg, outmsg = ‘x’; MPI_Status Stat; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numtasks); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { dest = 1; source = 1; rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD); rc = MPI_Recv(&inmsg, […]

在C中使用MPI的分段错误错误?

所以我需要在C中使用MPI并行实现向量加法函数。不幸的是,当我运行它时,它打印了许多内存位置的痕迹,然后是这条消息: ================================================================================== = BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES = PID 2419 RUNNING AT hbaum-pc = EXIT CODE: 6 = CLEANING UP REMAINING PROCESSES = YOU CAN IGNORE THE BELOW CLEANUP MESSAGES =================================================================================== YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Aborted (signal 6) This typically refers to a problem with your application. Please […]

clGetProgramBuildInfo不打印构建日志

我在OpenCL中编写了一个代码。 构建内核程序时出错。 错误代码是-11。 我尝试打印BUILD LOG但它没有打印正确的日志,而是生成一些随机变量。 这是那部分 //these are variable declarations cl_device_id* devices; cl_program kernelprgrm; size_t size; //these varaibles have already been assigned properly //main code clGetProgramBuildInfo(kernelprgrm,devices[i], CL_PROGRAM_BUILD_LOG ,0,NULL,&size); char *buildlog=(char*)malloc(size); clGetProgramBuildInfo(kernelprgrm,devices[i], CL_PROGRAM_BUILD_LOG ,size,buildlog,NULL); printf(“\n\nBuildlog: %s\n\n”,buildlog); 它给出了以下输出: – Buildlog: 0 请帮助我获取正确的构建日志。 谢谢

我们可以将此任务并行化吗?

给定一个C字符串(以NULL字符常量终止的字符数组),我们必须找到字符串的长度。 能否为N个执行线程建议一些并行化的方法。 我有问题分为子问题,因为访问不存在的arrays的位置将给出分段错误。 编辑 :我并不担心并行执行此任务可能会带来更大的开销。 只是想知道是否可以这样做(使用类似openmp等的东西)

如何正确使用MPI_Scatterv()

我在并行程序中使用MPI_Scatterv时遇到问题。 以下是它的定义方式: int MPI_Scatterv(const void *sendbuf, const int *sendcounts, const int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) 我理解它的方式, MPI_Scatterv和MPI_Scatter之间的区别在于, MPI_Scatterv段中的段不必具有相同的长度,并且它们不必是连续的(允许存储器中的间隙)。 我不明白的部分是,如果recvbuf可以是每个进程的不同大小的数组,那么应该用于recvcount 。 假设我想将5个sendbuf元素发送到进程0和15进行处理1. recvcount的值应该是多少?

使用降雪包在R中使用C-in-R函数进行并行计算。 问题:Mac显示加载轮子并几乎冻结

我有一个包含C-within-R函数的R包,名为myFun。 我想在我的并行计算中称之为myFun。 这个myFun在我的Mac上运行良好,但是当它通过并行计算functionsfClusterApplyLB调用时,它显示出奇怪的行为:我的Mac显示加载轮子和R几乎冻结。 过了一会儿,R停止冻结,sfClusterApplyLB返回并行化的结果。 我真的想避免这种冻结状态,因为我甚至无法在冻结时向上/向下滚动R控制台! 为了说明这一点,我有一个小例子代码。 我有一个小的C代码,循环100次,每20秒打印一次迭代次数,每次迭代hibernate1秒: # include # include # include # include # include SEXP myC (SEXP j) { for (int i = 0; i < 100; i++) { R_FlushConsole(); R_ProcessEvents(); R_CheckUserInterrupt(); sleep(1); // sleep one second at each iteration. this sleep is // replaced by something in my code if (i%20==0) […]

通过OpenMPI进行非阻塞数据共享

我正在尝试使用OpenMPI在多个工作人员之间传播数据,但是,我正在以相当自定义的方式进行数据划分,这种方式不适用于MPI_Scatter或MPI_Broadcast 。 我想要做的是给每个处理器一些工作在一个队列(或其他一些异步机制),这样他们可以在第一块数据上做他们的工作,采取下一个块,重复直到不再有块。 我知道MPI_Isend ,但是如果我用MPI_Isend发送数据,我不能修改它直到它完成发送; 强迫我使用MPI_Wait ,因此必须等到线程完成接收数据! 是否有解决此问题的标准解决方案,还是我必须重新考虑我的方法?

使用MPI写入文件

我正在写一个文件如下。 顺序并不一定重要(虽然如果我可以通过K订购它会很好,就像在串行代码中本身一样) CALL MPI_BARRIER(MPI_COMM_WORLD, IERR) OPEN(EIGENVALUES_UP_IO, FILE=EIGENVALUES_UP_PATH, ACCESS=’APPEND’) WRITE(EIGENVALUES_UP_IO, *) K * 0.0001_DP * PI, (EIGENVALUES(J), J = 1, ATOM_COUNT) CLOSE(EIGENVALUES_UP_IO) 我知道这可能是最糟糕的选择。 我已经看过MPI_FILE_WRITE_AT等但是我不确定他们(直接)以我的forms获取数据? 该文件必须采用与此格式相同的格式,该格式为每K行一行,ATOM_COUNT + 1列。 值为REAL(8) 我一遍又一遍地寻找,并且找不到任何关于实现这一点的简单参考。 有帮助吗? 🙂 C中的类似代码(假设它与FORTRAN基本相同)同样有用 谢谢!

在CUDA中并行化for循环(1D Naive Convolution)

有人可以帮我转换嵌套的for循环到CUDA内核吗? 这是我试图转换为CUDA内核的函数: // Convolution on Host void conv(int* A, int* B, int* out) { for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) out[i + j] += A[i] * B[j]; } 我已经非常努力地并行化这段代码。 这是我的尝试: __global__ void conv_Kernel(int* A, int* B, int* out) { int i = blockIdx.x; […]