首先看下我們在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 是可變的,它是指標變...