【发布时间】:2015-07-01 15:29:40
【问题描述】:
我正在尝试在 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 程序中构建,通过它添加 dt,出现在我的 Runge-Kutta 代码中。
但是,当我运行整个过程时,会显示以下错误消息:
<kernel>:52:22: error: can't convert between vector values of different size ('double' and 'float8')
qs = q[gid] + dt * v[gid]/6.0;
~~ ^ ~~~~~~
<kernel>:53:33: error: can't convert between vector values of different size ('double' and 'float8')
qm[gid] = q[gid] + 0.5 * dt * v[gid];
~~~~~~~~ ^ ~~~~~~
<kernel>:57:15: error: can't convert between vector values of different size ('double' and 'float8')
qs += dt * v[gid]/3.0;
~~ ^ ~~~~~~
<kernel>:58:33: error: can't convert between vector values of different size ('double' and 'float8')
qm[gid] = q[gid] + 0.5 * dt * v[gid];
~~~~~~~~ ^ ~~~~~~
<kernel>:62:15: error: can't convert between vector values of different size ('double' and 'float8')
qs += dt * v[gid]/3.0;
~~ ^ ~~~~~~
<kernel>:63:27: error: can't convert between vector values of different size ('double' and 'float8')
qm[gid] = q[gid] + dt * v[gid];
~~ ^ ~~~~~~
<kernel>:67:15: error: can't convert between vector values of different size ('double' and 'float8')
qs += dt * v[gid]/6.0;
干杯
【问题讨论】:
-
double 和 float8 一样吗?你试过投射吗?
-
我不这么认为。值 dt 已经在 python 部分中进行了转换。我会在上面编辑它。
-
已解决:好吧,我用我将在上面编辑的困难方式解决了这个问题。感谢 Jiminion 的建议!
-
请勿编辑您的问题以使其成为答案!相反,写一个你自己问题的答案(这是很好接受的)。你甚至可以接受,但不会获得任何声誉。
-
哦,对不起!我将在下面发布我的解决方案^^'谢谢!