cuda笔记-初始化矩阵及thread,block,grid概念
生活随笔
收集整理的這篇文章主要介紹了
cuda笔记-初始化矩阵及thread,block,grid概念
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
thread:一個CUDA的并行程序會被許多threads來執行;
block:多個threads組成一個block,同一個block中threads可以使用_syncthreads()同步,也可以通過shared memory通信。
gird:多個blocks會構成grid。
?
如下代碼:
dim3 blocksize(2, 3); dim3 gridsize(3, 3);上面的意思是,有2行 * 3列的thread組成一個塊,有3行 * 3列的塊組成了個網。
?
下面是在網中如何獲得線程ID:
grid為1,block為1
int threadId = blockId.x * blockDim.x + threadIdx.x;grid為1,block為2
int threadId = block.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.xgrid為1,block為3
int threadId = blockId.x * blockDim.x * blockDim.y *blockDim.z + threadIdx.z * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x;下面舉個例子,是矩陣的初始化。
程序運行截圖如下:
功能也就是將20 * 20全為0的矩陣,變成,矩陣中某個值為x + y的形式。
源碼如下:
#include "cuda_runtime.h" #include "device_launch_parameters.h" #include <iostream> #include <stdio.h>using namespace std;__device__ int coord_int(int x, int y) {return x + y; }__global__ void Matrix_init(int *a, int m, int n) {int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x < m && y < n) {a[y * n + x] = coord_int(x, y);} }void show_Matrix(int *a, int m, int n) {for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cout << a[i * m + j] << " ";}cout << endl;}cout << endl; }int main() {int *gpu_int;int cpu_init[400] = {0};show_Matrix(cpu_init, 20, 20);cudaMalloc((void**)&gpu_int, 400 * sizeof(int));dim3 blockdim(8, 8);dim3 gridim(3, 3);Matrix_init << <gridim, blockdim >> > (gpu_int, 20, 20);cudaMemcpy(cpu_init, gpu_int, 400 * sizeof(int), cudaMemcpyDeviceToHost);show_Matrix(cpu_init, 20, 20);cudaFree(gpu_int);getchar();return 0; }其中這一段的意思是:
x的是獲取當前矩陣里面,x的坐標,y為在矩陣中y的坐標(當前塊的ID號乘以當前塊的維度加上這個塊中x的偏移,姑且叫偏移吧),這個y*n + x是將矩陣坐標轉化為數組坐標。
?
總結
以上是生活随笔為你收集整理的cuda笔记-初始化矩阵及thread,block,grid概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt文档阅读笔记-Q_INVOKABLE
- 下一篇: 信息安全工程师笔记-国产密码算法(国密)