c++ - 使用 cuda 的结构内的 GPU 并行化函数
问题描述
我开始使用 cuda,试图提高我的代码速度。
所以,我有一个 chain.h 文件,我在其中定义了 Chain_1D 结构和一些函数
extern int N;
struct Chain_1D
{
int N_mons;
double *x_old = (double*) malloc(sizeof(double)*N);
float *X;
// Allocate Unified Memory – accessible from CPU or GPU
cudaMallocManaged(&X, N*sizeof(float));
__global__ void step();
};
__global__
void Chain_1D::step()
{
// Update x_old!
for (int i = 0; i < N_mons; i++) x_old[i] = X[i] ;
int index = threadIdx.x;
int stride = blockDim.x;
for (int j=index ; j<N_mons ; j += stride)
{
if (j==0)
{
X[0] += - (x_old[2]-3*x_old[1]+2*x_old[0])*dt;
} else if (j==1)
{
X[1] += - (x_old[3]-4*x_old[2]+6*x_old[1]-3*x_old[0])*dt ;
} else if (j==N_mons-2)
{
X[N_mons-2] += -(x_old[N_mons-4]-4*x_old[N_mons-3]+6*x_old[N_mons-2]-3*x_old[N_mons-1])*dt;
} else if (j==N_mons-1)
{
X[N_mons-1] += -(x_old[N_mons-3]-3*x_old[N_mons-2]+2*x_old[N_mons-1])*dt;
} else
{
X[j] += - (x_old[j-2]+x_old[j+2]-4*x_old[j-1]-4*x_old[j+1]+6*x_old[j])*dt;
}
}
// Wait for GPU to finish before accessing on host
cudaDeviceSynchronize();
}
然后我打算在main()
函数(和 main.cu 文件)中使用它
Chain_1D chain;
chain.init_Chain();
for (int i = 1; i < N_runs; i++)
{
chain.step<<<1, 200>>>();
}
cudaFree(chain.X);
它不起作用,我相信是由于这个__global__
函数的定义。任何人都可以帮忙吗?
解决方案
在执行读取它们的 CUDA 内核之前,您应该将所有必需的变量移动到 GPUN_mons
(例如,like或x_old
)。
cudaMallocManaged(&X, N*sizeof(float));
此外,由于声明中的函数调用,我怀疑您的代码是否可以编译struct
!它在 C++ 和 CUDA 中均无效。
我建议您先阅读 CUDA 教程(例如:https ://cuda-tutorial.readthedocs.io/en/latest/ )。
推荐阅读
- java - 如何使用 firebase 数据库中的值?
- windows - Chrome、Windows 上的灰色表情符号
- javascript - v-if 在 Vuex getter 上
- google-bigquery - BigQuery 查询历史记录:获取性能计数器/指标
- c# - 我的 c 代码中的错误,Console.ReadLine 错误?
- python-3.x - 为什么闰年也没有返回?
- javascript - 使用用户输入询问玩家是否想再次玩。问题:特定条件下的循环
- ios - 如何在 UIScrollView 中设置一个空的 UIStackView 以便我可以在运行时填充它?
- c++ - 无法创建窗口
- python - 如何从 html 页面导入表格并将其正确转换为 pandas 数据框?