Memory 在CPU和GPU之间同步静态分配的结构实例

Memory 在CPU和GPU之间同步静态分配的结构实例,memory,struct,cuda,static-allocation,Memory,Struct,Cuda,Static Allocation,我有一个包含数组的结构,我想将内容从CPU内存中该结构的一个实例复制到GPU内存中的另一个实例 我的问题类似于。这个问题与链接中的问题有两大区别: 我没有使用结构数组。我只需要一个 结构的所有实例都是静态分配的 为了回答我自己的问题,我尝试修改答案中的代码,如下所示: #包括 #包括 #定义cudaCheckError(){\ cudaError_t err=cudaGetLastError()\ 如果(err!=cudaSuccess){\ printf(“Cuda错误:%s:%d:%s\n”

我有一个包含数组的结构,我想将内容从CPU内存中该结构的一个实例复制到GPU内存中的另一个实例

我的问题类似于。这个问题与链接中的问题有两大区别:

  • 我没有使用结构数组。我只需要一个
  • 结构的所有实例都是静态分配的
  • 为了回答我自己的问题,我尝试修改答案中的代码,如下所示:

    #包括
    #包括
    #定义cudaCheckError(){\
    cudaError_t err=cudaGetLastError()\
    如果(err!=cudaSuccess){\
    printf(“Cuda错误:%s:%d:%s\n”,“文件”,“行”,“cudaGetErrorString(err))\
    出口(1)\
    } \
    }
    结构测试{
    字符数组[5];
    };
    __全局无效内核(测试*开发测试){
    对于(int i=0;i<5;i++){
    printf(“内核[0][i]:%c\n”,开发测试[0]。数组[i]);
    }
    }
    __设备测试开发测试//dev_测试现在是全局的、静态分配的,并且是结构的一个实例
    内部主(空){
    int size=5;
    Test;//Test现在是静态分配的,并且是结构的一个实例
    字符温度[]={a',b',c',d',e'};
    memcpy(test.array,temp,size*sizeof(char));
    cudaCheckError();
    cudaMemcpy(&dev_test,&test,sizeof(test),cudamemcpyhostodevice);
    cudaCheckError();
    内核(&dev_测试);
    cudaCheckError();
    cudaDeviceSynchronize();
    cudaCheckError();
    //无内存
    返回0;
    }
    
    但此代码会引发运行时错误:

    Cuda error: HelloCUDA.cu:34: invalid argument
    

    使用静态分配的
    设备变量时,是否有方法将
    测试
    复制到
    开发测试

  • 我们不使用
    cudaMemcpy
    API。我们使用
    cudaMemcpyFromSymbol
    (或
    cudaMemcpyFromSymbol
    )API

  • 我们不会将
    \uuuu设备\uuuu
    变量作为内核参数传递。它们是全球性的。您只需在内核代码中使用它们

  • 以下代码解决了这些问题:

    $ cat t10.cu
    #include <stdio.h>
    
    #define cudaCheckError() { \
        cudaError_t err = cudaGetLastError(); \
        if(err != cudaSuccess) { \
          printf("Cuda error: %s:%d: %s\n", __FILE__, __LINE__, cudaGetErrorString(err)); \
          exit(1); \
        } \
      }
    
    struct Test {
        char array[5];
    };
    
    __device__ Test dev_test; //dev_test is now global, statically allocated, and one instance of the struct
    
    __global__ void kernel() {
        for(int i=0; i < 5; i++) {
            printf("Kernel[0][i]: %c \n", dev_test.array[i]);
        }
    }
    
    
    int main(void) {
    
        int size = 5;
        Test test; //test is now statically allocated and one instance of the struct
    
        char temp[] = { 'a', 'b', 'c', 'd' , 'e' };
        memcpy(test.array, temp, size * sizeof(char));
    
        cudaCheckError();
        cudaMemcpyToSymbol(dev_test, &test, sizeof(Test));
        cudaCheckError();
        kernel<<<1, 1>>>();
        cudaCheckError();
        cudaDeviceSynchronize();
        cudaCheckError();
    
        //  memory free
        return 0;
    }
    $ nvcc -o t10 t10.cu
    $ cuda-memcheck ./t10
    ========= CUDA-MEMCHECK
    Kernel[0][i]: a
    Kernel[0][i]: b
    Kernel[0][i]: c
    Kernel[0][i]: d
    Kernel[0][i]: e
    ========= ERROR SUMMARY: 0 errors
    $
    
    $cat t10.cu
    #包括
    #定义cudaCheckError(){\
    cudaError_t err=cudaGetLastError()\
    如果(err!=cudaSuccess){\
    printf(“Cuda错误:%s:%d:%s\n”,“文件”,“行”,“cudaGetErrorString(err))\
    出口(1)\
    } \
    }
    结构测试{
    字符数组[5];
    };
    __设备测试开发测试//dev_测试现在是全局的、静态分配的,并且是结构的一个实例
    __全局无效内核(){
    对于(int i=0;i<5;i++){
    printf(“内核[0][i]:%c\n”,dev_test.array[i]);
    }
    }
    内部主(空){
    int size=5;
    Test;//Test现在是静态分配的,并且是结构的一个实例
    字符温度[]={a',b',c',d',e'};
    memcpy(test.array,temp,size*sizeof(char));
    cudaCheckError();
    cudaMemcpyToSymbol(开发测试和测试,尺寸(测试));
    cudaCheckError();
    内核();
    cudaCheckError();
    cudaDeviceSynchronize();
    cudaCheckError();
    //无内存
    返回0;
    }
    $nvcc-o t10 t10.cu
    $cuda memcheck./t10
    ==========CUDA-MEMCHECK
    内核[0][i]:a
    内核[0][i]:b
    内核[0][i]:c
    内核[0][i]:d
    内核[0][i]:e
    ======错误摘要:0个错误
    $
    
    (您在内核代码中使用的数组也没有意义。
    dev_test
    不是数组,因此您无法索引到它:
    dev_test[0]…