OpenCL 产生错误的计算

2024-02-23

我一直尝试使用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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCL 产生错误的计算 的相关文章

随机推荐

  • 得到 Y 处的多项式 X? (Python 3.10、NumPy)

    我正在尝试根据 Python 3 10 中以系数降序给出的多项式计算某个 Y 值处的所有可能的实 X 值 我希望将生成的 X 值以list 我尝试过使用roots 的功能numpy图书馆 如答案之一所示这个帖子 https stackove
  • PayPal 自适应付款 - 错误 520009 - 帐户受到限制

    如果这是一个愚蠢的问题 请提前道歉 我确实尝试四处挖掘 但找不到答案 我正在尝试设置链式支付 在沙箱环境中 但收到错误 520009 帐户受到限制 尝试了几个电子邮件地址 它们都给我这个错误 电子邮件地址未在 Paypal 中注册 但据我所
  • 等待ajax响应相同的功能

    我知道类似的问题已经发布过很多次了 但是我读过很多 但找不到我的问题的答案 我有一个等待 ajax 请求响应的函数 很多人会问为什么 好吧 我正在使用一个执行函数的 Wizard Jquery 插件onLeaveAStepFunction当
  • 如何在 GridView 文本框中放置必填字段验证器

    我有一个GridView和一些TemplateField含有的物品TextBox控制 我想在其上添加一个必填字段验证器 这是我的代码
  • 颤动导航栏

    我刚刚开始应用程序开发 正在为导航栏而苦苦挣扎 下面的那个很好 但是上面的那个不好 我想删除按钮上方的灰色空间 你能帮助我吗 Code override Widget build BuildContext context return ne
  • 在 django 中记录格式化程序

    来自Django 文档 https docs djangoproject com en 1 7 topics logging examples 这是日志记录的示例格式 formatters verbose format levelname
  • 公开自托管服务时以编程方式从配置文件中读取 WCF 行为元素

    我的 app config 中有这样的配置
  • Symfony2 计算与另一个实体相关的实体字段

    我有 2 个实体 作者和书籍 1 个作者可能有很多书 我想在表格中显示每个作者有多少本书 每个作者的数量不同 我已经看过了this https stackoverflow com questions 17665271 counting th
  • PHP usort 不会对类进行排序

    这是要排序的元素数组的示例 items array 0 gt object stdClass 8 public id gt string 110 length 3 public brand id gt string 18 length 2
  • Python print 与 Javascript console.log()

    在Python中 print 1 2 n 3 4 会打印 1 2 3 4 在 JavaScript 中 console log 1 2 n 3 4 prints 1 2 n 3 4 与上面的 Python 等效的 Javascript 语句
  • 无法打开相机连接到相机时发生错误:0

    我开始开发一个应用程序 我需要使用手机的相机 当我使用 Camera open 方法时 无论是否带有cameraId 它都会返回错误 连接到相机时发生错误 0 我的 AndroidManifest xml 是
  • 如何在html页面中以格式化的方式显示html代码[重复]

    这个问题在这里已经有答案了 我的网站是一个简单的教育网站 我想以格式化的方式在我的网页中显示 HTML 代码 就像在编辑器中一样 我的意思是 HTML 标签应该以与剩余文本等不同的颜色显示 这是来自另一个网站的代码片段 我想要我的网页的输出
  • 使用 google guava 的 CacheBuilder 的 scala 2.10 类型不匹配

    我正在 scala 2 10 1 中为我的一些实体编写通用缓存 目前 我正在使用 google Guava 的 CacheBuilder 因为 scala 生态系统中没有太多选择 Code trait CachedEntity E lt K
  • SurfaceView隐藏屏幕上的其他组件

    我正在创建一个 FrameLayout 类型的布局 在其中添加两个视图 两个视图分别是GLSurfaceView和SurfaceView的对象 根据有关 SurfaceView 的 Android 开发人员文档 表面是 Z 排序的 因此它位
  • 如何用 pandas DataFrame 中之前和后续值的平均值替换 NaN?

    如果我有一些缺失值 并且我想用之前和之后值的平均值替换所有 NaN 我该怎么做 我知道我可以使用pandas DataFrame fillna with method ffill or method bfill 用前面或后面的值替换 NaN
  • 使用 AVPlayer 音频播放 AVMutableComposition 不同步

    我有一个带有 2 个音频轨道和 1 个视频轨道的 AVMutableComposition 我使用该合成从 mov 文件中串接大约 40 个不同的视频剪辑 将每个剪辑的视频内容放入合成的视频轨道中 将音频放入音轨中 我用于音乐的第二个音轨
  • 使用异步延迟加载属性

    我已经学会了在我的存储库中延迟加载属性 现在我想这样做 但我还需要从网页加载一些内容 使用 Httpclient 这意味着我的属性将是异步的 public async Task
  • 荷兰国旗 - 不适用于更大的阵列

    我的下面的荷兰国旗解决方案似乎不适用于仅包含 3 个元素 0 1 和 2 的给定输入数组 如果我减小数组的大小 它就会起作用 我无法识别错误 我错过了什么吗 class DNF public static void sort int arr
  • WordPress WP_Query 通话帖子和页面

    我设置了一个功能滑块 用于绘制标记为 功能 的帖子 my query new WP Query array showposts gt 3 tag gt feature 可以在帖子和页面中绘制吗 我知道你可以用以下方式绘制页面 post ty
  • OpenCL 产生错误的计算

    我一直尝试使用openCL做一些计算 但结果不正确 我输入了三个 float3 如下所示 300000 0 0 300000 300000 0 300000 300000 300000 进入这个内核 kernel void gravitat