OpenCL производит неправильные вычисления

Я пытаюсь использовать 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() 

One Solution collect form web for “OpenCL производит неправильные вычисления”

float3 выравниваются по 16 байт. См. Спецификацию OpenCL 1.1, 6.1.5.

  • Есть ли способ профилировать OpenCL или программу pyOpenCL?
  •  
    Interesting Posts for Van-Lav

    анализ слов и оценка из файла python

    Может ли SQLAlchemy использоваться с Google Cloud SQL?

    Кэш объектов Python

    ошибка автокорреляционного сюжета в plt.acorr matplotlib?

    Получение предупреждения об устаревании в Sklearn над массивом 1d, несмотря на отсутствие массива 1D

    Невозможно импортировать Numpy в Python

    Преобразование большого XML-файла в реляционную базу данных

    Преобразование Pandas SparseDataframe в Scipy sparse csc_matrix

    Оценка автокорреляции с использованием Python

    Ошибка при запуске примера базового тензора

    Каковы хорошие библиотеки для создания программы python для (визуально привлекательных) 3D-моделирования / визуализации физики?

    Показывать только определенные предметы в легенде Python Matplotlib

    Как получить местоположение ошибки из json.loads в Python

    Как заставить XPath выбрать несколько элементов таблицы с одинаковыми атрибутами идентификатора?

    «Невозможно установить атрибут» с свойствами нового стиля в Python

    Python - лучший язык программирования в мире.