如何使用兩個裝置,以改善例如 以下代碼(矢量的總和)的表現? 「同時」可以使用更多設備嗎? 如果是,我如何管理不同設備的全局內存上的向量分配?多GPU的基本用法
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <cuda.h>
#define NB 32
#define NT 500
#define N NB*NT
__global__ void add(double *a, double *b, double *c);
//===========================================
__global__ void add(double *a, double *b, double *c){
int tid = threadIdx.x + blockIdx.x * blockDim.x;
while(tid < N){
c[tid] = a[tid] + b[tid];
tid += blockDim.x * gridDim.x;
}
}
//============================================
//BEGIN
//===========================================
int main(void) {
double *a, *b, *c;
double *dev_a, *dev_b, *dev_c;
// allocate the memory on the CPU
a=(double *)malloc(N*sizeof(double));
b=(double *)malloc(N*sizeof(double));
c=(double *)malloc(N*sizeof(double));
// allocate the memory on the GPU
cudaMalloc((void**)&dev_a, N * sizeof(double));
cudaMalloc((void**)&dev_b, N * sizeof(double));
cudaMalloc((void**)&dev_c, N * sizeof(double));
// fill the arrays 'a' and 'b' on the CPU
for (int i=0; i<N; i++) {
a[i] = (double)i;
b[i] = (double)i*2;
}
// copy the arrays 'a' and 'b' to the GPU
cudaMemcpy(dev_a, a, N * sizeof(double), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, N * sizeof(double), cudaMemcpyHostToDevice);
for(int i=0;i<10000;++i)
add<<<NB,NT>>>(dev_a, dev_b, dev_c);
// copy the array 'c' back from the GPU to the CPU
cudaMemcpy(c, dev_c, N * sizeof(double), cudaMemcpyDeviceToHost);
// display the results
// for (int i=0; i<N; i++) {
// printf("%g + %g = %g\n", a[i], b[i], c[i]);
// }
printf("\nGPU done\n");
// free the memory allocated on the GPU
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
// free the memory allocated on the CPU
free(a);
free(b);
free(c);
return 0;
}
在此先感謝您。 米歇爾
非常感謝你talonmies!你的建議會讓我開始好...對不起我的英文不好。 – micheletuttafesta
沒有什麼可道歉的,我理解這個問題和英文寫得完美。 – talonmies
使用'cudaMemcpyAsync'將是可取的,以實現併發執行,參見[併發CUDA多GPU執行(http://stackoverflow.com/questions/11673154/multiple-gpus-on-cuda-concurrency-issue/35010019# 35010019)。 – JackOLantern