python - OpenCL 产生错误的计算

标签 python opencl gpgpu

我一直尝试使用openCL进行一些计算,但结果不正确。

我输入了三个 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;
}

我最初试图模拟一组物体的引力相互作用,这就是内核看起来像这样的原因。

对于输出我得到:

[600000.0,0.0,0.0]
[x,600000.0,0.0]
[600000.0,x,600000.0]

其中 x 是一个范围从 NaN 到 0 到 10^-44 之间的值,并且每次运行内核时都不同。 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()

最佳答案

float3 是 16 字节对齐的。请参阅 OpenCL 1.1 规范 6.1.5。

关于python - OpenCL 产生错误的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6591144/

相关文章:

c++ - 在 CUDA 中高效评估索引映射函数

c++ - 在 C++ 中将矩阵高效分解为方形子矩阵

python - 进程数增加时多处理挂起

python - 在 Python 中合并 NumPy 数组并查找列

c++ - OpenCL 内置函数选择

内核运行需要调用 clGetDeviceInfo

python - 训练人脸识别模型

python - 使用标准库 python 创建波形表示

c++ - 如何创建 NVIDIA OpenCL 项目

cuda - 如何使用 Nvidia 多进程服务 (MPS) 运行多个非 MPI CUDA 应用程序?