“无法在不同大小的向量值之间转换”

2024-10-17 10:27:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用C语言运行Runge Kutta 4。代码如下:

__kernel void updade_state( __global float8 *q,__global float8 *qm, __global float8 *v){

const int gid = get_global_id(0);
float8 qs;


//k1
f( q, v);
qs = q[gid] + dt * v[gid]/6.0;
qm[gid] = q[gid] + 0.5 * dt * v[gid];

//k2
f(qm, v);
qs +=  dt * v[gid]/3.0;
qm[gid] = q[gid] + 0.5 * dt * v[gid];

//k3
f( qm, v);
qs +=  dt * v[gid]/3.0;
qm[gid] = q[gid] + dt * v[gid];

//k4
f( qm, v);
qs +=  dt * v[gid]/6.0;

//update particle
q[gid] = qs;

}

我使用pyopencl模块访问我的显卡(“gid”),以便更有效地运行多个粒子的模拟。在

除了在内核中调用的函数f之外,内核的其余部分都是在python程序中构建的,通过这个程序,它被添加到我的Runge-Kutta代码中的常量dt。在

但是,当我运行整个程序时,以下错误消息显示:

^{pr2}$

干杯


Tags: 代码程序dtkernel内核globalstaterunge
1条回答
网友
1楼 · 发布于 2024-10-17 10:27:48

好吧,我绕过了这个问题,并按照Jiminion的建议,通过在内核中转换dt值和其他常量来解决它。这不是最优雅的解决方案,但它是有效的。在

__kernel void updade_state( __global float8 *q,__global float8 *qm, __global float8 *v){

const int gid = get_global_id(0);
float8 qs;
float  dt, c1, c2, c3;

c1 = 6.0;
c2 = 3.0;
c3 = 0.5;    

dt = 0.0001;


//k1
f( q, v);
qs = q[gid] + dt * v[gid]/c1;
qm[gid] = q[gid] + c3 * dt * v[gid];

//k2
f(qm, v);
qs +=  dt * v[gid]/c2;
qm[gid] = q[gid] + c3 * dt * v[gid];

//k3
f( qm, v);
qs +=  dt * v[gid]/c2;
qm[gid] = q[gid] + dt * v[gid];

//k4
f( qm, v);
qs +=  dt * v[gid]/c1;

//update photon
q[gid] = qs;

}

相关问题 更多 >