平行計算入門案例

2021-08-20 07:35:30 字數 2954 閱讀 7570

首先是cuda程式設計,分三步,把資料從記憶體拷貝進視訊記憶體,gpu進行計算,將結果從視訊記憶體拷貝回記憶體。

cuda-c程式氣泡排序案例:

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include #include #define n 400

void random_ints(int *);

__global__ void mykernel(int *d_a)

} __syncthreads(); //執行緒同步

if (i % 2 == 0 && (2 * tid + 2) < n )

} __syncthreads(); //執行緒同步

} d_a[tid] = s_a[tid]; //將排序結果搬回到global memory

}int main()

//釋放記憶體

free(a);

cudafree(d_a);

return 0;

}void random_ints(int *a)

for (int i = 0; i < n; i++)

}

然後openmp只需要在迴圈耗時的地方加上一句話即可。

還有就是mpi使用6個基本函式即可。

mpi初始化:通過mpi_init函式進入mpi環境並完成所有的初始化工作

int mpi_init( int *argc, char * * * argv )
mpi結束:通過mpi_finalize函式從mpi環境中退出

int mpi_finalize(void)
獲取程序的編號:呼叫mpi_comm_rank函式獲得當前程序在指定通訊域中的編號,將自身與其他程式區分

int mpi_comm_rank(mpi_comm comm, int *rank)
獲取指定通訊域的程序數:呼叫mpi_comm_size函式獲取指定通訊域的程序個數,確定自身完成任務比例

int mpi_comm_size(mpi_comm comm, int *size)
訊息傳送:mpi_send函式用於傳送乙個訊息到目標程序

int mpi_send(void *buf, int count, mpi_datatype dataytpe, int dest, int tag, mpi_comm comm)
訊息接受:mpi_recv函式用於從指定程序接收乙個訊息

int mpi_recv(void *buf, int count, mpi_datatype datatyepe,int source, int tag, mpi_comm comm, mpi_status *status)
圓周率計算案例:

【openmp_pi】

#include #include#include#define num_threads 8

double seriel_pi();

double parallel_pi();

static long num_steps = 1000000000;

double step;

void main()

double parallel_pi()

pi = sum * step;

return pi;

}double seriel_pi()

pi = step * sum;

return pi;

}

【cuda_pi】

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include #include#includedouble seriel_pi();

#define b 128 //塊的個數

#define t 512 //每個塊中的執行緒數

#define n 1000000000 //劃分的step個數

__global__ void reducepi1(double *d_sum)

for (int i = (blockdim.x >> 1); i>0; i >>= 1)

__syncthreads();

} if (id == 0)

}int main()

double seriel_pi()

pi = step * sum;

return pi;

}

【mpi_pi】

#include#include "mpi.h"

#include#pragma comment (lib, "msmpi.lib")

int main(int argc, char *argv) {

int my_rank, num_procs;

int i, n = 100000000;

double sum=0.0, step, x, mypi, pi;

double start = 0.0, stop = 0.0;

mpi_init(&argc, &argv); //初始化環境

mpi_comm_size(mpi_comm_world, &num_procs); //獲取並行的程序數

mpi_comm_rank(mpi_comm_world, &my_rank); //當前程序在所有程序中的序號

start = mpi_wtime();

step = 1.0 / n;

for (i = my_rank; i序列

並行

pthread平行計算入門

實現並行的庫有很多,比如mpi庫,openmp等,同樣pthread也是實現並行的乙個庫。pthread實現並行的是共享記憶體的方式,即如何cpu都可以訪問相同的記憶體區域。這種實現方式實現起來比較簡單,但是會存在臨界區等問題。以下是最簡單的一段並行的 其實現了建立多個執行緒,為多執行緒函式傳遞引數...

平行計算入門 openMP

openmp提供了對於並行描述的高層抽象,降低了並行程式設計的難度和複雜度,這樣程式設計師可以把更多的精力投入到並行演算法本身,而非其具體實現細節。對基於資料分集的多執行緒程式設計,openmp是乙個很好的選擇。同時,使用openmp也提供了更強的靈活性,可以較容易的適應不同的並行系統配置。執行緒粒...

python平行計算 python平行計算

0.基礎並行 發 multiprocessing threading 1.concurrent 2.併發 asynico 3.ipython下的平行計算 使用ipyparallel庫的ipython提供了前所未有的能力,將科學python的探索能力與幾乎即時訪問多個計算核心相結合。系統可以直觀地與本...