カーネルにサイズ 1000 x 1000 の配列を送信しているが、グローバル配列を使用してこれを行う方法を知りたいと言っているため、編集された質問は混乱しています。この量のデータをカーネルに送信する方法として私が知っている唯一の方法は、グローバル配列を使用することです。そのため、おそらくグローバル メモリ内の配列を使用して既にこれを行っているでしょう。
それにもかかわらず、グローバル メモリで配列を作成して初期化するには、少なくとも 2 つの方法があります。
1. と を使用して静的に、__device__
たとえばcudaMemcpyToSymbol
:
#define SIZE 100
__device__ int A[SIZE];
...
int main(){
int myA[SIZE];
for (int i=0; i< SIZE; i++) myA[i] = 5;
cudaMemcpyToSymbol(A, myA, SIZE*sizeof(int));
...
(kernel calls, etc.)
}
(デバイス変数参照、cudaMemcpyToSymbol参照)
cudaMalloc
2.およびを使用して動的にcudaMemcpy
:
#define SIZE 100
...
int main(){
int myA[SIZE];
int *A;
for (int i=0; i< SIZE; i++) myA[i] = 5;
cudaMalloc((void **)&A, SIZE*sizeof(int));
cudaMemcpy(A, myA, SIZE*sizeof(int), cudaMemcpyHostToDevice);
...
(kernel calls, etc.)
}
( cudaMalloc 参照, cudaMemcpy 参照)
わかりやすくするために、すべての cuda 呼び出しとカーネル呼び出しで実行する必要があるエラー チェックを省略しています。