Я пытаюсь использовать OpenCL с FSCL на F #, но я получить некоторые ошибки, которые я не понимаюFSCL ошибка на простом примере
open FSCL.Compiler
open FSCL.Language
open FSCL.Runtime
open Microsoft.FSharp.Linq.RuntimeHelpers
open System.Runtime.InteropServices
[<StructLayout(LayoutKind.Sequential)>]
type gpu_point2 =
struct
val mutable x: float32
val mutable y: float32
new (q ,w) = {x=q; y=w}
end
[<ReflectedDefinition>]
let PointSum(a:gpu_point2,b:gpu_point2) =
let sx =(a.x+b.x)
let sy =(a.y+b.y)
gpu_point2(sx,sy)
[<ReflectedDefinition;Kernel>]
let Modgpu(b:float32[], c:float32[],wi:WorkItemInfo) =
let gid = wi.GlobalID(0)
let arp = Array.zeroCreate<gpu_point2> b.Length
let newpoint = gpu_point2(b.[gid],c.[gid])
arp.[gid] <- newpoint
arp
[<ReflectedDefinition;Kernel>]
let ModSum(a:gpu_point2[],b:gpu_point2[],wi:WorkItemInfo) =
let gid = wi.GlobalID(0)
let cadd = Array.zeroCreate<gpu_point2> a.Length
let newsum = PointSum(a.[gid],b.[gid])
cadd.[gid] <- newsum
cadd
[<ReflectedDefinition;Kernel>]
let ModSum2(a:gpu_point2[],b:gpu_point2[],wi:WorkItemInfo) =
let gid = wi.GlobalID(0)
let cadd = Array.zeroCreate<gpu_point2> a.Length
let newsum = gpu_point2(a.[gid].x+b.[gid].x,a.[gid].y+b.[gid].y)
cadd.[gid] <- newsum
cadd
let ws = WorkSize(64L)
let arr_s1= <@ Modgpu([|0.f..63.f|],[|63.f..(-1.f)..0.f|],ws)@>.Run()
let arr_s2 = <@ Modgpu([|63.f..(-1.f)..0.f|],[|0.f..63.f|],ws)@>.Run()
С помощью этого кода, когда я пытаюсь использовать ModSum в
let rsum = <@ ModSum(arr_s1,arr_s2,ws)@>.Run()
не работает, но вместо того, чтобы, когда я использую ModSum2 отлично работает
let rsum = <@ ModSum2(arr_s1,arr_s2,ws)@>.Run()
ошибка я получаю первый раз, когда я запустить его является
FSCL.Compiler.CompilerException: Непризнанный конструкт в теле ядра NewObject (gpu_point2, Sx, Sy)
и если я повторно запустить консоль FSI говорит
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
Единственное, что я знаю, это то, что ошибка не связана с использованием другой функции, так как я могу определить функцию точечного произведения, которая работает.
[<ReflectedDefinition>]
let PointProd(a:gpu_point2,b:gpu_point2) =
let f = (a.x*b.x)
let s = (a.y*b.y)
f+s
Таким образом, я предполагаю, что проблема исходит от типа возвращаемого PointSum, но есть способ, чтобы создать такую функцию, чтобы подвести две точки и возвращает тип точки? А почему не работает?
Edit/Update:
Также с записью происходит то же самое, если я определить тип, как:
[<StructLayout(LayoutKind.Sequential)>]
type gpu_point_2 = {x:float32; y:float32}
Если я пытаюсь создать функцию, которая непосредственно суммирует два gpu_point_2 на функция работает, но если я вызываю вторую функцию, она вызывает ту же ошибку, что и при использовании структуры.
Нет, я проверял, что он не работает. Кроме того, я сделал некоторые поиски и результаты, чем нет необходимости использовать [] и [] со структурой. если я не использую атрибуты, вторая функция работает, и первая из них все еще вызывает ошибку. Это можно увидеть на этом примере [gigub fSCL] (https://github.com/FSCL/FSCL.Compiler/blob/master/tests/FSCL.Compiler.Tests/DataTypeTests.fs), а также есть другой способ сделать сумма, но она не использует дополнительную функцию. То же самое происходит, если я использую запись. Я обновлю вопрос –