CUDA学习(三)之使用GPU进行两个数组相加
生活随笔
收集整理的這篇文章主要介紹了
CUDA学习(三)之使用GPU进行两个数组相加
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?傳入兩個數組,在GPU中將兩個數組對應索引位置相加
#include "cuda_runtime.h" #include "device_launch_parameters.h"#include <iomanip> #include <iostream> #include <stdio.h>using namespace std;//檢測GPU bool CheckCUDA(void){int count = 0;int i = 0;cudaGetDeviceCount(&count);if (count == 0) {printf("找不到支持CUDA的設備!\n");return false;}cudaDeviceProp prop;for (i = 0; i < count; i++) {if (cudaGetDeviceProperties(&prop, i) == cudaSuccess) {if (prop.major >= 1) {break;}}}if (i == count) {printf("找不到支持CUDA的設備!\n");return false;}cudaGetDeviceProperties(&prop, 0);printf("GPU is: %s\n", prop.name);cudaSetDevice(0);printf("CUDA initialized success.\n");return true; }//使用一維數組相加 __global__ void addForOneDim(double *a, double *b, double *c, int N);//初始化一維數組 void InitOneDimArray(double *a, double b, int N);int main(){//檢測GPUif (!CheckCUDA()){cout << "No CUDA device.";return 0;}//****數組相加************************************************************************************************************************cout << "****************************************數組相加*********************************************************************" << endl;int N = 20; //定義數組大小double *h_a_one, *h_b_one, *h_c_one; //聲明在CPU上使用的指針double *d_a_one, *d_b_one, *d_c_one; //聲明在GPU上使用的指針//為數組分配大小h_a_one = new double[N]; h_b_one = new double[N];h_c_one = new double[N];cudaMalloc((void **)&d_a_one, sizeof(double)*N); //在GPU上分配內存空間cudaMalloc((void **)&d_b_one, sizeof(double)*N);cudaMalloc((void **)&d_c_one, sizeof(double)*N);//為數組初始化InitOneDimArray(h_a_one, 1.1, N);InitOneDimArray(h_b_one, 2.2, N);//使用GPU中分配的指針指向CPU中的數組cudaMemcpy(d_a_one, h_a_one, sizeof(double)*N, cudaMemcpyHostToDevice);cudaMemcpy(d_b_one, h_b_one, sizeof(double)*N, cudaMemcpyHostToDevice);//調用核函數,使用1個線程塊N個線程//addForOneDim<<<1, N>>>(h_a_one, h_b_one, d_c_one, N); //不能使用h_a_one和h_b_one,只能使用GPU上定義的指針,不然結果如圖一所示addForOneDim<<<1, N>>>(d_a_one, d_b_one, d_c_one, N); //結果如圖二所示
//調用核函數,使用N個線程塊,每個線程塊中包含1個線程
//addForOneDim<<<N, 1>>>(d_a_one, d_b_one, d_c_one, N); //結果如圖三所示//將GPU上計算好的結果返回到CPU上定義好的變量cudaMemcpy(h_c_one, d_c_one, sizeof(double)*N, cudaMemcpyDeviceToHost);//打印結果for (int i = 0; i < N; i++){cout << h_a_one[i] << " + " << h_b_one[i] << " = " << h_c_one[i] << endl; }cout << endl << endl;system("pause");return 0; } //使用一維數組相加 __global__ void addForOneDim(double *a, double *b, double *c, int N){int tid = threadIdx.x; //線程索引,啟用1個線程塊,每個線程塊N個線程if (tid < N){c[tid] = a[tid] + b[tid];} }//初始化一維數組 void InitOneDimArray(double *a, double b, int N){for (int i = 0; i < N; i++){a[i] = (i+1) * b;//cout << a[i] << endl; } }
?
?圖一 (該圖是錯誤的)
?
?圖二 (該圖是正確的)
?
圖三 (該圖是錯誤的)當在調用核函數時,
addForOneDim<<<N, 1>>>(d_a_one, d_b_one, d_c_one, N);使用的索引是
int tid = threadIdx.x; //對應的是一個線程塊中每個線程id正確的索引是?
int tid = blockIdx.x; //對應的是每個線程塊id?
?
轉載于:https://www.cnblogs.com/xiaoxiaoyibu/p/10089172.html
總結
以上是生活随笔為你收集整理的CUDA学习(三)之使用GPU进行两个数组相加的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习的前期入门汇总
- 下一篇: 20172307 2018-2019