C++ 初始化CUDA设备上的嵌套数组
我想在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>
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));