【问题标题】:"Can't convert between vector values of different size"“无法在不同大小的向量值之间进行转换”
【发布时间】: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 的建议!
  • 请勿编辑您的问题以使其成为答案!相反,写一个你自己问题的答案(这是很好接受的)。你甚至可以接受,但不会获得任何声誉。
  • 哦,对不起!我将在下面发布我的解决方案^^'谢谢!

标签: python c pyopencl


【解决方案1】:

好吧,我解决了这个问题,并按照 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;

}

【讨论】:

  • 很高兴你有一些工作。您可以在 updade_state() 中将 dt 作为参数传递。如果需要,您可以在使用前对其进行更改或重铸。
猜你喜欢
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
相关资源
最近更新 更多