首先是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的探索能力與幾乎即時訪問多個計算核心相結合。系統可以直觀地與本...