CUDA拷貝二維陣列到GPU記憶體中

2021-10-10 17:46:35 字數 2100 閱讀 9170

cuda 複雜問題 + 細節問題 解答 見 cuda複雜問題 + 細節問題 解答

網上沒找到如何拷貝二維陣列到gpu的例程,所以我就自己寫乙個,其實原理也很簡單,就是用三維指標匯入給二維指標分配記憶體。

先說一下我們的目標:匯入到gpu乙個二維陣列:dev_data[arraynum][mwidth * mheight],該陣列內元素的值是data[i][j] = i + 0.001*j。我們首先先輸出data[i][7]。

然後我們再在gpu裡把陣列的data[i][7]全都改為82,然後再輸出所有的data[i][7]。

最後應該得到的結果:

先說一下基本流程:

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include "cuda.h"

#include using std::cout;

using std::endl;

#define arraynum 100

#define mwidth 10

#define mheight 10

float **data;

float ** middata;

float **dev_data;

int main()

cout << endl;

cout << endl;

//改變一下gpu記憶體資料

cudachange << > >(dev_c, dev_data);

//輸出一下改變以後的值

cudatest << > >(dev_c, dev_data);

cudamemcpy(c, dev_c, arraynum * sizeof(float), cudamemcpydevicetohost);

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

cout << endl;

cout << endl;

system("pause");

return 0;

}

核函式:

__global__ void cudatest(float *c, float **dev_data)

__global__ void cudachange(float *c, float **dev_data)

重點內容是datainit()函式,負責資料的初始化:

float **data;

float ** middata;

float **dev_data;

首先先把二維陣列進行初始化:

data = (float**)malloc(arraynum * sizeof(float * ));

middata = (float**)malloc(arraynum * sizeof(float *));

cudamalloc((void***)&(dev_data), arraynum * sizeof(float * ));

middata的作用是:

}這樣就能把二維陣列拷貝到記憶體裡使用了。

C 二維陣列拷貝到另乙個二維陣列

有如下陣列 a 1 2 3 4 5 6 7 8 9 10 11 12 要把這個陣列的第一行和第三行拷貝到乙個新的陣列中,即有 b 1 2 3 4 9 10 11 12 如下 int a new int int logicnum a.getlength 0 3 int framenum a.getle...

二維vector傳遞到CUDA中實現平行計算

std vector傳遞到cuda中實現平行計算 我們知道std vector記憶體分配時連續的,但是對於二維陣列或多維陣列來說,內部vector不占用外部vector的空間,所以二維陣列或多維陣列內部每一行的記憶體都是連續的,外部vector儲存內部vector的相關資訊,也是連續的。詳細內容可參...

c 二維陣列傳遞與拷貝

定義 string arr new string 12,31 另一種string ary new string 5 相當於一維陣列 常量二維陣列定義,用readonly不能用const readonly int dir 如果是靜態在前面直接加static 傳遞void print2darray in...