将庞大的数组结构复制到 GPU
Copy huge structure of arrays to GPU
我需要将现有的关于SPH(=平滑粒子流体动力学(的代码转换为可以在GPU上运行的代码。
不幸的是,它有很多数据结构,我需要从 CPU 复制到 GPU。我已经在网上查找了,我想,我为我的复制代码做了正确的事情,但不幸的是,我遇到了一个错误(带有未处理异常的东西(。
当我打开调试器时,我看到没有传递给我的变量的信息应该复制到 GPU。它只是说"无法读取内存"。
因此,下面是一个需要复制到 GPU 的数据结构的示例:
__device__ struct d_particle_data
{
float Pos[3]; /*!< particle position at its current time */
float PosMap[3]; /*!< initial boundary particle postions */
float Mass; /*!< particle mass */
float Vel[3]; /*!< particle velocity at its current time */
float GravAccel[3]; /*!< particle acceleration due to gravity */
}*d_P;
我通过以下方式将其传递到 GPU 上:
cudaMalloc((void**)&d_P, N*sizeof(sph_particle_data));
cudaMemcpy(d_P, P, N*sizeof(d_sph_particle_data), cudaMemcpyHostToDevice);
数据结构 P 看起来与数据结构d_P相同。有人可以帮助我吗?
编辑
因此,这是该代码的一小部分:
首先,我必须在代码中使用的标头:
Allvars.h:我在主机上需要的变量
struct particle_data { float a; float b; } *P;
proto.h:包含所有函数的标头
extern void main_GPU(int N, int Ntask);
Allvars_gpu.h:必须在 GPU 上的所有变量
__device__ struct d_particle_data { float a; float b; } *d_P;
所以,现在我从.cpp文件调用 -.cu-File:九头蛇.cpp:
#include <stdio.h>
#include <cuda_runtime.h>
extern "C" {
#include "proto.h"
}
int main(void) {
int N_gas = 100; // Number of particles
int NTask = 1; // Number of CPUs (Code has MPI-stuff included)
main_GPU(N_gas,NTask);
return 0;
}
现在,操作发生在 .cu-File 中:hydro_gpu.cu:
#include <cuda_runtime.h>
#include <stdio.h>
extern "C" {
#include "Allvars_gpu.h"
#include "allvars.h"
#include "proto.h"
}
__device__ void hydro_evaluate(int target, int mode, struct d_particle_data *P) {
int c = 5;
float a,b;
a = P[target].a;
b = P[target].b;
P[target].a = a+c;
P[target].b = b+c;
}
__global__ void hydro_particle(struct d_particle_data *P) {
int i = threadIdx.x + blockIdx.x*blockDim.x;
hydro_evaluate(i,0,P);
}
void main_GPU(int N, int Ntask) {
int Blocks;
cudaMalloc((void**)&d_P, N*sizeof(d_particle_data));
cudaMemcpy(d_P, P, N*sizeof(d_particle_data), cudaMemcpyHostToDevice);
Blocks = (N+N-1)/N;
hydro_particle<<<Blocks,N>>>(d_P);
cudaMemcpy(P, d_P, N*sizeof(d_particle_data), cudaMemcpyDeviceToHost);
cudaFree(d_P);
}
真正简短的答案可能是不要将*d_P
声明为静态__device__
符号。这些不能作为设备指针参数传递给cudaMalloc
、cudaMemcpy
或内核启动,并且在此示例中,您对__device__
的使用既不必要又不正确。
如果进行该更改,则代码可能会开始工作。请注意,前段时间我对尝试实际编译MCVE代码失去了兴趣,并且很可能还有其他问题,但是我对这个问题太无聊了,无法寻找它们。添加此答案主要是为了将此问题从 CUDA 标签的未回答队列中移除。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 如何在openACC中复制gpu vector-of-vector-pointer-memory
- 内存是如何复制到GPU的
- 使用 CUDA 将大数据复制到 GPU 和从 GPU 复制大数据
- 从GPU到CPU的副本比将CPU复制到GPU慢
- 计算gpu前缓冲区中像素的平均值,而无需将前缓冲区复制回系统内存
- 如何使用 GPU-DMA 从 GPU-CUDA 代码来复制数据
- DirectX 11 - 计算着色器,将数据从 GPU 复制到 CPU
- 将庞大的数组结构复制到 GPU
- 将阵列从 RAM 复制到 GPU,以及从 GPU 复制到 RAM
- CUDA:分配1d设备内存来将2d指针到指针主机数组复制到GPU
- 使用推力将部分数据集复制到多个 CUDA GPU