Как уже упоминал Роберт, я написал статью, в которой показано, как реализовать Game of Life в F # с использованием Accelerator v2, поэтому вы можете взглянуть на это для рабочей версии.Я помню, что у меня была похожая проблема, но я не знаю точно, по какому сценарию.
В любом случае, если вы используете DX9Target
, проблема может заключаться в том, что эта цель не должна поддерживать операции с целыми числами (потому что эмуляция целочисленной арифметики на GPU точно невозможна при использовании DX9).Я считаю, что это также причина, по которой я использовал FloatParallelArray
в своей реализации.У вас есть шанс попробовать X64MulticoreTarget
, чтобы посмотреть, сработает ли это?
РЕДАКТИРОВАТЬ : Я провел дальнейшие исследования и (если я не пропустил что-то важное), похоже, это ошибка в методе CompareEqual
.Вот гораздо более простой пример, который показывает проблему:
open Microsoft.ParallelArrays
let target = new DX9Target()
let zeros = new IntParallelArray(Array2D.create 4 4 0)
let trues = target.ToArray2D(ParallelArrays.CompareEqual(zeros, zeros))
trues |> Array2D.iter (printfn "%A")
Ожидаемый результат будет true
(несколько раз), но если вы запустите его, он напечатает true
только 4 раза, а затем напечатает12 раз false
.Я спрошу кого-нибудь из команды акселераторов и выложу ответ здесь.В то же время вы можете сделать то же самое, что и я в моем примере - симулировать логические операции с использованием FPA
и избегать использования BPA
и CompareEqual
.
EDIT 2 : Вот ответ от членов команды акселератора:
Это связано с отсутствием точных целочисленных вычислений на графических процессорах DX9.Из-за числового джиттера булево сравнение целого числа с самим собой не всегда вычисляется как точно равное.(...)
Итак, в общем, вы не можете действительно полагаться на BPA
.Единственный вариант - сделать то, что я предложил - имитировать логические значения, используя FPA
(и, возможно, сравнить число с некоторой небольшой дельта-окрестностью, чтобы избежать дрожания, вызванного графическими процессорами).Однако этот шоудл работает с X86MulticoreTarget
- если вы можете найти какое-то минимальное повторение, показывающее, в каких ситуациях происходит сбой библиотеки, это было бы действительно полезно!