2016-07-28 2 views
4

Я пытаюсь использовать 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 на функция работает, но если я вызываю вторую функцию, она вызывает ту же ошибку, что и при использовании структуры.

ответ

0

Попробуйте добавить [<ReflectedDefinition>] на конструктор gpu_point2:

[<StructLayout(LayoutKind.Sequential)>] 
type gpu_point2 = 
    struct 
     val mutable x: float32 
     val mutable y: float32 
     [<ReflectedDefinition>] new (q, w) = {x=q; y=w} 
    end 

Обычно каждый код, который вызывается из устройства нужен этот атрибут, Конструкторы включен.

+0

Нет, я проверял, что он не работает. Кроме того, я сделал некоторые поиски и результаты, чем нет необходимости использовать [] и [] со структурой. если я не использую атрибуты, вторая функция работает, и первая из них все еще вызывает ошибку. Это можно увидеть на этом примере [gigub fSCL] (https://github.com/FSCL/FSCL.Compiler/blob/master/tests/FSCL.Compiler.Tests/DataTypeTests.fs), а также есть другой способ сделать сумма, но она не использует дополнительную функцию. То же самое происходит, если я использую запись. Я обновлю вопрос –

Смежные вопросы