malloc()
CUDA で使用すると、 /を使用した動的メモリ割り当てcalloc()
が正しく機能していないようです。
チェックに関しては、 を使用して次のコードを書きましたcalloc()
。配列には必要なメモリが割り当てられているようで、いくつかの値を割り当てることもできます。しかし、カーネルから行列要素を出力すると、ガベージ値しか表示されませんでした。私はそれが問題かもしれないと思ったcudaMemcpy()
が、代わりに**A
、のように置くとA[5][5]
、コードは完璧に機能する.
そして、memset()
使用すると「コアダンプ」エラーが発生します。
malloc()
/calloc()
エラーなしで仲良くするのを手伝ってくれる人はいますか?
#include<stdio.h>
__global__ void threads(int* dA)
{
int gi=threadIdx.x+(blockIdx.x*blockDim.x);
int gj=threadIdx.y+(blockIdx.y*blockDim.y);
printf("global Id in X= %d, in Y =%d, E= %d\n", gi,gj,dA[gi*5+gj]);
}
int main(int argc, char** argv)
{
int **A, *dA;
int R=5, C=4;
int size=R*C*sizeof(int);
A=(int **)calloc(R, sizeof(int*));
for(int i=0; i<R; i++)
A[i]=(int *)calloc(C, sizeof(int));
// memset(A, 0, size);
for(int i=0; i<R; i++)
{
for(int j=0; j<C; j++)
A[i][j]=i*C+j;
}
printf(" \n Before \n");
for(int i=0; i<R; i++)
{
for(int j=0; j<C; j++)
printf("%d ",A[i][j]);
printf("\n");
}
cudaMalloc((int**) &dA, size);
cudaMemcpy(dA, A, size, cudaMemcpyHostToDevice);
dim3 nblocks(R,C);
dim3 nthreads(1);
threads<<<nblocks, nthreads>>>(dA);
cudaDeviceSynchronize();
cudaFree(dA);
free(A);
return 0;
}