0

structこの短い例では、cuda デバイス メモリ内のポインターを使用して init を持つテーブルを渡そうとしています。ホストへのコピー -> デバイス、デバイス -> ホストは機能しているようですが、 `_ global _ function nothing works. Values fordA` は null であり、変更できません。

Aからに値をコピーする方法がわかりませんdA。このような基本的なテーブルを使用する fcomplex A[N][N]と機能しますが、ここではこれは私がやりたいことではありません。これはコードです:

#include<assert.h>
#include <cuda.h>
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cuda_runtime.h>
#include <cuda_runtime_api.h>

#define N 5// side of matrix containing data

#define checkCudaErrors(val) check( (val), #val, __FILE__, __LINE__)

typedef struct {float re,im;} fcomplex; 

__global__ void kernel(fcomplex * da)
{
    int x = threadIdx.x;
    int y = threadIdx.y;
    int i = (N*y) + x;
    //da[i].re += 2;
    printf("%f \n",da[i].re);
}

int main(int argc, char * argv[])
{
 fcomplex  *dA,**A,**B;

 A= (fcomplex **)malloc(N * sizeof(fcomplex* ));
 B=(fcomplex **)malloc(N * sizeof( fcomplex*  ));

 for (int i = 0; i < N; i++){
    A[i] = (fcomplex *)malloc(N * sizeof(fcomplex ));
    B[i] = (fcomplex *)malloc(N * sizeof(fcomplex ));
 }
 for (int i = 0; i < N; i++)
 {   for (int d= 0; d < N; d++)
     {
    A[i][d].re = i*d;
    A[i][d].im = i*d;
     }
 }

 checkCudaErrors(cudaMalloc((void **)&dA, (size_t)(sizeof(fcomplex)*N*N)));
 checkCudaErrors(cudaMemcpy(dA,A,N*N*sizeof(fcomplex),cudaMemcpyHostToDevice));

 const dim3 blockSize(N,N);
 const dim3 gridSize(1,1);

 kernel<<<gridSize,blockSize>>>(dA);

 checkCudaErrors(cudaThreadSynchronize());
 checkCudaErrors(cudaGetLastError());

 checkCudaErrors(cudaMemcpy(B, dA, sizeof(fcomplex)*N*N, cudaMemcpyDeviceToHost));
 for (int i = 0; i < N; i++)
 {  for (int d= 0; d < N; d++)
    {
     printf("%f-%f\n",A[i][d].re,B[i][d].re);
     printf("%f-%f\n",A[i][d].im,B[i][d].im);
    }
 }
 //verify(A,B,N);

 free(A);
 free(B);
 cudaFree(dA);
 //cudaFree(dB);
}

void verify(fcomplex ** A, fcomplex ** B, int size)
{
 for (int i = 0; i < size; i++)
 {  for (int d= 0; d < size; d++)
    {
     assert(A[i][d].re==B[i][d].re);
    }
 }
 printf("Correct!");
}
4

1 に答える 1