C++ 初始化CUDA设备上的嵌套数组

C++ 初始化CUDA设备上的嵌套数组,c++,cuda,C++,Cuda,我想在CUDA设备上初始化一个结构数组,其中每个结构包含一个双精度数组: typedef struct TimeSeries { double* values; } TimeSeries; TimeSeries* allTimeSeries; 我尝试使用CUDA托管内存初始化结构的alltimeseries数组,然后初始化每个值双精度数组 以下是我的最小工作示例: #include <cuda.h> #include <cuda_runtime_api.h>

我想在CUDA设备上初始化一个结构数组,其中每个结构包含一个双精度数组:

typedef struct TimeSeries
{
    double* values;
} TimeSeries;

TimeSeries* allTimeSeries;
我尝试使用CUDA托管内存初始化结构的
alltimeseries
数组,然后初始化每个
双精度数组

以下是我的最小工作示例:

#include <cuda.h>
#include <cuda_runtime_api.h>
#include <array>
#include <iostream>

#define cudaCheckErrors(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, const char *file, int line)
{   
    if (code != cudaSuccess) 
    {
        fprintf(stderr, "%s %s %d\n", cudaGetErrorString(code), file, line);
        exit(code);
    }
}   

typedef struct TimeSeries
{
    double* values;
} TimeSeries;

void print_host(TimeSeries* all)
{
    printf("CPU %f %f\n", all[0].values[0], all[0].values[1]);
    printf("CPU %f\n", all[1].values[0]);
}

__global__ void print_device(TimeSeries* all)
{
    printf("GPU %f %f\n", all[0].values[0], all[0].values[1]);
    printf("GPU %f\n", all[1].values[0]);
}

int main()
{   
    TimeSeries* all;
    cudaCheckErrors(cudaMallocManaged(reinterpret_cast<void**>(&all),
            2*sizeof(TimeSeries)));

    cudaCheckErrors(cudaMallocManaged(
            reinterpret_cast<void**>(&(all[0].values)), 2*sizeof(double)));
    cudaCheckErrors(cudaMallocManaged(
            reinterpret_cast<void**>(&(all[1].values)), 1*sizeof(double)));

    all[0].values[0] = 4.8;
    all[0].values[1] = 3.3;
    all[1].values[0] = 0.4;

    print_host(all);
    print_device<<<1, 1>>>(all);

    cudaCheckErrors(cudaFree(all[0].values));
    cudaCheckErrors(cudaFree(all[1].values));
    cudaCheckErrors(cudaFree(all));

    return 0;
}

如何在不破坏GPU的情况下初始化此数据?我不介意解决方案是否使用统一(托管)内存。

在发布问题后不久,我不可避免地发现了问题。在调用
cudaFree()
之前,我需要调用
cudaDeviceSynchronize()

打印主机(全部);
打印设备(全部);
cudaCheckErrors(cudaDeviceSynchronize());
cudaCheckErrors(cudaFree(所有[0].值));
cudaCheckErrors(cudaFree(所有[1].值));
cudaCheckErrors(cudaFree(all));

我使用调试器发现了问题。

我不明白为什么这样可以解决问题
cudaFree
应该是同步的,因此在
cudaFree
之前调用
cudaDeviceSynchronize
不应该改变任何事情。您的内核在这两种情况下都返回错误代码吗?
cudaFree
是否隐式地与设备同步?像你一样,我认为它应该。或者我需要在初始化
all
数组后立即
cudaDeviceSynchronize
?我想可能不会;我假设它是同步的,因为没有流参数,如果我想允许异步内存管理,这就是我所期望的。但我真的不知道
CPU 4.800000 3.300000
CPU 0.400000

Command terminated
print_host(all);
print_device<<<1, 1>>>(all);

cudaCheckErrors(cudaDeviceSynchronize());

cudaCheckErrors(cudaFree(all[0].values));
cudaCheckErrors(cudaFree(all[1].values));
cudaCheckErrors(cudaFree(all));