2
私はopenCLを使っていくつかの計算を行ってきましたが、結果は正しくありません。OpenCLが不正確な計算を生成する
I次のようになり、入力3するfloat3さん:このカーネルへの
[300000,0,0]
[300000,300000,0]
[300000,300000,300000]
:
__kernel void gravitate(__global const float3 *position,__global const float3 *momentum,__global const float3 *mass,__global float3 *newPosition,__global float3 *newMomentum,unsigned int numBodies,unsigned int seconds)
{
int gid=get_global_id(0);
newPosition[gid]=position[gid]*2;
newMomentum[gid]=momentum[gid]*2;
}
私はもともと、なぜカーネルで体のグループの重力相互作用をシミュレートしようとしていましたそのように見える。 ouputをのために
私が取得:
のxがNaNから0〜10^-44の範囲であり、カーネルが実行されるたびに異なる値である[600000.0,0.0,0.0]
[x,600000.0,0.0]
[600000.0,x,600000.0]
。 newPositionとnewMomentumの両方に同じ不正な出力パターンがあります。私はこのようなルックスを使用してい
のpythonコード:
def __init__(self):
self.context=cl.create_some_context()
self.queue=cl.CommandQueue(self.context)
f=open("gravitate.cl")
self.program=cl.Program(self.context,f.read()).build()
def simulate(self,seconds):
bodyPosition=[]
bodyMomentum=[]
bodyMass=[]
for body in self.objects:
bodyPosition+=[body.position.x,body.position.y,body.position.z]
bodyMomentum+=[body.momentum.x,body.momentum.y,body.momentum.z]
bodyMass+=[body.mass]
bodyPosition=numpy.array(bodyPosition).astype(numpy.float32)
bodyMomentum=numpy.array(bodyMomentum).astype(numpy.float32)
bodyMass=numpy.array(bodyMass).astype(numpy.float32)
bodyPositionCl=cl.Buffer(self.context,cl.mem_flags.READ_ONLY|cl.mem_flags.COPY_HOST_PTR,hostbuf=bodyPosition)
bodyMomentumCl=cl.Buffer(self.context,cl.mem_flags.READ_ONLY|cl.mem_flags.COPY_HOST_PTR,hostbuf=bodyMomentum)
bodyMassCl=cl.Buffer(self.context,cl.mem_flags.READ_ONLY|cl.mem_flags.COPY_HOST_PTR,hostbuf=bodyMass)
newBodyPosition=numpy.zeros(len(self.objects)*3).astype(numpy.float32)
newBodyMomentum=numpy.zeros(len(self.objects)*3).astype(numpy.float32)
newBodyPositionCl=cl.Buffer(self.context,cl.mem_flags.WRITE_ONLY,newBodyPosition.nbytes)
newBodyMomentumCl=cl.Buffer(self.context,cl.mem_flags.WRITE_ONLY,newBodyMomentum.nbytes)
self.program.gravitate(self.queue,(3,),None,bodyPositionCl,bodyMomentumCl,bodyMassCl,newBodyPositionCl,newBodyMomentumCl,numpy.uint32(len(self.objects)),numpy.uint32(seconds))
cl.enqueue_read_buffer(self.queue,newBodyPositionCl,newBodyPosition).wait()
cl.enqueue_read_buffer(self.queue,newBodyMomentumCl,newBodyMomentum).wait()