Tag: 并行处理

如何优化矩阵乘法(matmul)代码,以便在单个处理器内核上快速运行

我正在研究并行编程概念,并尝试在单核上优化矩阵乘法示例。 到目前为止我提出的最快的实现如下: /* This routine performs a dgemm operation * C := C + A * B * where A, B, and C are lda-by-lda matrices stored in column-major format. * On exit, A and B maintain their input values. */ void square_dgemm (int n, double* A, double* B, double* C) { /* For each […]

Openmpi mpmd获得通信大小

我有两个openmpi程序,我这样开始 mpirun -n 4 ./prog1 : -n 2 ./prog2 现在我如何使用MPI_Comm_size(MPI_COMM_WORLD, &size)使得我得到大小值 prog1 size=4 prog2 size=2. 到目前为止,我在两个节目中都获得了“6”。

如何从C使用MPI_Scatter和MPI_Gather?

到目前为止,我的应用程序正在读取带有整数列表的txt文件。 这些整数需要由主进程存储在数组中,即排名为0的处理器。这样可以正常工作。 现在,当我运行程序时,我有一个if语句检查它是否是主进程,如果是,我正在执行MPI_Scatter命令。 根据我的理解,这将使用数字细分数组并将其传递给从属进程,即所有rank> 0。 但是,我不知道如何处理MPI_Scatter 。 从属进程如何“订阅”以获取子数组? 如何告诉非主进程对子数组执行某些操作? 有人可以提供一个简单的例子来向我展示主进程如何从数组中发出元素然后让奴隶添加总和并将其返回给主数据库,将所有总和加在一起并将其打印出来? 我的代码到目前为止: #include #include //A pointer to the file to read in. FILE *fr; int main(int argc, char *argv[]) { int rank,size,n,number_read; char line[80]; int numbers[30]; int buffer[30]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); fr = fopen (“int_data.txt”,”rt”); //We open the file to be read. if(rank […]

MPI – 按订单打印

我正在尝试在C中编写一个函数,每个处理器都会打印自己的数据。 这是我有的: void print_mesh(int p,int myid,int** U0,int X,int Y){ int i,m,n; for(i=0;i<p;i++){ if(myid==i){ printf("myid=%d\n",myid); for(n=0;n<X;n++){ for(m=0;m<Y;m++){ printf("%d ",U0[n][m]); } printf("\n"); } } else MPI_Barrier(MPI_COMM_WORLD); } } 它由于某种原因不起作用。 arrays全部混合打印。 你有什么见解,为什么这不起作用? 还有其他有用的想法吗? 如果可能,我不想在主进程中发送整个数组。 另外,我不想使用预编译function。

如何确保动态分配的数组在openmp中是私有的

我在Linux机器上使用gcc使用openMP在C中工作。 在openmp并行for循环中,我可以将静态分配的数组声明为private。 考虑代码片段: int a[10]; #pragma omp parallel for shared(none) firstprivate(a) for(i=0;i<4;i++){ 一切都按预期工作。 但如果相反我动态分配, int * a = (int *) malloc(10*sizeof(int)); #pragma omp parallel for shared(none) firstprivate(a) a(至少a [1 … 9])的值不受保护,但就好像它们是共享的一样。 这是可以理解的,因为pragma命令中的任何内容似乎都没有告诉omp数组a需要私有多大。 如何将此信息传递给openmp? 如何将整个动态分配的数组声明为私有?

使用MPI分散不同大小的矩阵块

(假设所有矩阵都按行主顺序存储。)说明问题的一个例子是在3×3网格上分布10×10矩阵,以便每个节点中子矩阵的大小看起来像 |—–+—–+—–| | 3×3 | 3×3 | 3×4 | |—–+—–+—–| | 3×3 | 3×3 | 3×4 | |—–+—–+—–| | 4×3 | 4×3 | 4×4 | |—–+—–+—–| 我在Stackoverflow上看过很多post(例如使用MPI和MPI分区矩阵将 C块中的2D数组块发送 到块中 )。 但是它们只处理相同大小的块(在这种情况下,我们可以简单地使用MPI_Type_vector或MPI_Type_create_subarray并且只使用一个MPI_Scatterv调用)。 所以,我想知道在MPI中将矩阵分散到处理器网格中的最有效方法是什么,其中每个处理器都有一个具有指定大小的块。 PS我也看过MPI_Type_create_darray ,但似乎没有让你为每个处理器指定块大小。

MPI_Type_create_subarray和MPI_Gather

我必须解决一个小的mpi问题。 我有4个从属进程,每个进程都希望向master 0发送一个2d子arrays(CHUNK_ROWS X CHUNK_COLUMNS).Master 0收集ddd [ROWS] [COLUMNS]中的所有块并打印出来。 我想用MPI_Gather() #include #include using namespace std; #define ROWS 10 #define COLUMNS 10 #define CHUNK_ROWS 5 #define CHUNK_COLUMNS 5 #define TAG 0 int** alloca_matrice(int righe, int colonne) { int** matrice=NULL; int i; matrice = (int **)malloc(righe * sizeof(int*)); if(matrice != NULL){ matrice[0] = (int *)malloc(righe*colonne*sizeof(int)); if(matrice[0]!=NULL) for(i=1; i<righe; […]

Cuda内核返回向量

我有一个单词列表,我的目标是在一个非常长的短语中匹配每个单词。 我在匹配每个单词方面没有问题,我唯一的问题是返回包含每个匹配信息的结构向量。 在代码中: typedef struct { int A, B, C; } Match; __global__ void Find(veryLongPhrase * _phrase, Words * _word_list, vector * _matches) { int a, b, c; […] //Parallel search for each word in the phrase if(match) //When an occurrence is found { _matches.push_back(new Match{ A = a, B = b, C = c […]

以对数时间平行减少

给定n部分和,可以将log2并行步骤中的所有部分和相加。 例如,假设有八个线程具有八个部分和: s0, s1, s2, s3, s4, s5, s6, s7 。 这可以在log2(8) = 3连续步骤中减少; thread0 thread1 thread2 thread4 s0 += s1 s2 += s3 s4 += s5 s6 +=s7 s0 += s2 s4 += s6 s0 += s4 我想用OpenMP做这个,但我不想使用OpenMP的reduction条款。 我想出了一个解决方案,但我认为可以使用OpenMP的task子句找到更好的解决方案。 这比标量加法更通用。 让我选择一个更有用的案例:数组缩减(请参见此处 , 此处以及有关数组缩减的更多信息)。 假设我想在数组a上进行数组缩减。 下面是一些代码,它们为每个线程并行填充私有数组。 int bins = 20; int a[bins]; int **at; // […]