我正在尝试对许多身体模拟进行 openACC 优化。目前,我面临一个导致以下内存问题的问题
调用
cuStreamSynchronize
返回的错误 700:内核执行期间的非法地址
调用cuMemFreeHost
返回的错误 700:内核执行期间的非法地址
srun
:错误:jrc0017:任务 0:以退出代码 1 退出
我正在使用pgc++
编译器,我的编译器标志是-acc -Minfo=accel -ta=tesla -fast -std=c++11
并且我不想使用-ta=tesla:managed
,因为我想自己组织内存。
#pragma acc kernels present(sim.part.rx, sim.part.ry, sim.part.rz, sim.part.vx, sim.part.vy, sim.part.vz)
{
for(int idx = 0; idx < sim.num; ++idx) { // Loop over target particle
float
prx = sim.part.rx[idx], // my position
pry = sim.part.ry[idx],
prz = sim.part.rz[idx];
float Fx = 0.f, Fy = 0.f, Fz = 0.f; // Force
#pragma acc loop
for(int jdx = 0; jdx < sim.num; ++jdx) { // Loop over interaction partners
if(idx != jdx) { // No self-force
const float dx = prx - sim.part.rx[jdx]; // Distance to partner
const float dy = pry - sim.part.ry[jdx];
const float dz = prz - sim.part.rz[jdx];
const float h = 1.f/sqrt(dx*dx + dy*dy + dz*dz + eps);
const float h3 = h*h*h;
Fx += dx*h3; // Sum up force
Fy += dy*h3;
Fz += dz*h3;
}
}
sim.part.vx[idx] += sim.mass*dt*Fx; // update velocity
sim.part.vy[idx] += sim.mass*dt*Fy;
sim.part.vz[idx] += sim.mass*dt*Fz;
}
}
如果我删除下面的代码
sim.part.vx[idx] += sim.mass*dt*Fx; // update velocity
sim.part.vy[idx] += sim.mass*dt*Fy;
sim.part.vz[idx] += sim.mass*dt*Fz;
我的代码能够毫无问题地运行。但是,如果我取消注释它们,我会遇到内存问题。似乎sim.part.vx
正在尝试更新数据,但编译器不知道导致内存问题的原因。
有谁知道如何解决这个问题?