CUDA中二級指標表示二級陣列

2021-09-17 18:17:08 字數 2645 閱讀 4767

首先看下我們在cpu上是如何用二級指標表示二維陣列的,其實就兩點:一是用一級指標儲存資料,二是用二級指標去按行索引資料位置。關於一級指標和二級指標的記憶體分配這裡不講了,注意資料型別就可以了。

#define row  8

#define col 4

//宣告row個行指標: cpua cpua+0  cpua+1 cpua+row

int **cpua = (int **)malloc(row * sizeof(int*));

int *cpudataa = (int*)malloc(row*col * sizeof(int));

//cpua[i] 看作行指標

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

//資料賦值

for (int i = 0; i < row*col; i++)

//按照二維陣列形式索引資料

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

printf("\n");

}

然後對應我們在gpu上使用二級指標,整體上其實和cpu沒有多大區別,把二級指標和一級指標儲存的資料 傳送到裝置上去,然後在裝置上建立二級指標和一級指標的對應關係。目的就是讓二級指標能夠指到對應的資料位置。

這裡簡單了畫了個示意圖:

gpu**如下:

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include #include #define row  8

#define col 4  

__global__ void addkernel(int **c,  int **a)} 

int main()

//將主機指標a指向裝置資料位置,目的是讓裝置二級指標能夠指向裝置資料一級指標

//a 和  dataa 都傳到了裝置上,但是二者還沒有建立對應關係

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

cudamemcpy(d_a, a, sizeof(int*) * row, cudamemcpyhosttodevice);

cudamemcpy(d_c, c, sizeof(int*) * row, cudamemcpyhosttodevice);

cudamemcpy(d_dataa, dataa, sizeof(int) * row * col, cudamemcpyhosttodevice);

dim3 threadperblock(4, 4);

dim3 blocknumber( (col + threadperblock.x - 1)/ threadperblock.x, (row + threadperblock.y - 1) / threadperblock.y );

printf("block(%d,%d)   grid(%d,%d).\n", threadperblock.x, threadperblock.y, blocknumber.x, blocknumber.y);

addkernel << > > (d_c, d_a);

//拷貝計算資料-一級資料指標

cudamemcpy(datac, d_datac, sizeof(int) * row * col, cudamemcpydevicetohost);

for (int i = 0; i < row*col; i++)

printf("%5d", datac[i]);

}printf("\n");

}

實驗結果:

直接上碼:

#include void modifyelement(int **p)

int main(void)

; int i = 0;

int j = 0;

int *p = (int *)&a[0][0];

printf("before modify: \n");

for(i = 0; i < 2; i++)

}printf("\n");

modifyelement((int **)&p);

printf("after modify: \n");

for(i = 0; i < 2; i++)

}printf("\n");

return 0;

}

執行結果:

before modify:

a[0][0] = 0 a[0][1] = 0 a[0][2] = 0 a[1][0] = 0 a[1][1] = 0 a[1][2] = 0

after modify:

a[0][0] = 1 a[0][1] = 0 a[0][2] = 0 a[1][0] = 0 a[1][1] = 0 a[1][2] = 0

C C 中二級指標的理解

以前在學習資料結構的時候一直沒弄懂函式引數裡面傳遞 p 以及使用 的含義,這裡摘抄了一小段文章方便理解。不懂的時候再看看這幾段 指標引數是如何傳遞記憶體的?如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體。見如下例子 void getmemory char ip,int num ip ch...

二級指標和陣列

1。int a 5 a是陣列首元素的位址,乙個常量指標,步長是乙個元素的長度即int 4個位元組 a是陣列的位址,在數值上與a 首元素的位址相等,但是步長是整個陣列的長度5 4個位元組 所以在數值上 a a 但是a 1 a 1 a 1移動四個位元組,a 1移動5 4個位元組 2.int p 5 p是...

二級指標與陣列

char str 這是字元指標陣列,每乙個陣列元素是乙個指標變數,而每個指標變數指向字串首字元位址,即是字串的位址。因為每乙個字串都代表的是乙個位址,是字串首字元的位址。字串常量是放在文字常量區,是不可以更改的。而指標陣列str裡面存放的是指向字串位址,它是可變的。如str 0 是可變的,它是指標變...