Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/vis12-cl/src/compiler/cl-target/cl-ty-translate.sml
ViewVC logotype

Diff of /branches/vis12-cl/src/compiler/cl-target/cl-ty-translate.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3094, Wed Mar 18 04:45:43 2015 UTC revision 3095, Wed Mar 18 13:12:57 2015 UTC
# Line 37  Line 37 
37     *)     *)
38      val copyToOutput : {ty : TreeIL.Ty.ty, dst : CLang.exp, src : CLang.exp} -> CLang.stm list      val copyToOutput : {ty : TreeIL.Ty.ty, dst : CLang.exp, src : CLang.exp} -> CLang.stm list
39    
   (* generate code to copy values from their shadow representation to the internal  
    * Diderot representation.  
    *)  
     val copyFromCPU : {ty : TreeIL.Ty.ty, dst : CLang.exp, src : CLang.exp} -> CLang.stm list  
   
40    end = struct    end = struct
41    
42      structure Ty = TreeIL.Ty      structure Ty = TreeIL.Ty
43      structure CL = CLang      structure CL = CLang
44      structure RN = RuntimeNames      structure CN = CNames
45      structure CLN = CLNames      structure ON = OCLNames
46    
47    (* translate a type to its CPU-side shadow type *)    (* translate a type to its CPU-side shadow type *)
48      fun toCPUType ty = (case ty      fun toCPUType ty = (case ty
49             of Ty.BoolTy => CL.T_Named "cl_bool"             of Ty.BoolTy => CL.T_Named "cl_bool"
50              | Ty.StringTy => raise Fail "CLTyTranslate.toCPUType: StringTy"              | Ty.StringTy => raise Fail "CLTyTranslate.toCPUType: StringTy"
51              | Ty.IntTy => !RN.gCPUIntTy              | Ty.IntTy => !CN.gCPUIntTy
52              | Ty.TensorTy[] => !RN.gCPURealTy              | Ty.TensorTy[] => !CN.gCPURealTy
53              | Ty.TensorTy dd => CL.T_Array(!RN.gCPURealTy, SOME(List.foldl Int.* 1 dd))              | Ty.TensorTy dd => CL.T_Array(!CN.gCPURealTy, SOME(List.foldl Int.* 1 dd))
54              | Ty.SeqTy(Ty.IntTy, n) => CL.T_Array(!RN.gCPUIntTy, SOME n)              | Ty.SeqTy(Ty.IntTy, n) => CL.T_Array(!CN.gCPUIntTy, SOME n)
55              | Ty.SeqTy(ty, n) => CL.T_Array(toCPUType ty, SOME n)              | Ty.SeqTy(ty, n) => CL.T_Array(toCPUType ty, SOME n)
56  (* what do we do with the following types?  (* what do we do with the following types?
57              | Ty.DynSeqTy _ => CL.T_Ptr(CL.T_Named N.dynSeqTy)              | Ty.DynSeqTy _ => CL.T_Ptr(CL.T_Named N.dynSeqTy)
58              | Ty.AddrTy info => CL.T_Ptr(CL.T_Num(ImageInfo.sampleTy info))              | Ty.AddrTy info => CL.T_Ptr(CL.T_Num(ImageInfo.sampleTy info))
59  *)  *)
60  (* FIXME: the following is probably not right, but we have to figure this out *)  (* FIXME: the following is probably not right, but we have to figure this out *)
61              | Ty.ImageTy info => CL.T_Ptr(CL.T_Named(RN.imageTy(ImageInfo.dim info)))              | Ty.ImageTy info => CN.imagePtrTy(ImageInfo.dim info)
62              | _ => raise Fail(concat["CLTyTranslate.toCPUType(", Ty.toString ty, ")"])              | _ => raise Fail(concat["CLTyTranslate.toCPUType(", Ty.toString ty, ")"])
63            (* end case *))            (* end case *))
64    
# Line 74  Line 69 
69      fun toGPUType ty = (case ty      fun toGPUType ty = (case ty
70             of Ty.BoolTy => CL.T_Named "bool"             of Ty.BoolTy => CL.T_Named "bool"
71              | Ty.StringTy => raise Fail "CLTyTranslate.toGPUType: StringTy"              | Ty.StringTy => raise Fail "CLTyTranslate.toGPUType: StringTy"
72              | Ty.IntTy => !CLN.gIntTy              | Ty.IntTy => !ON.gIntTy
73              | Ty.TensorTy[] => !CLN.gRealTy              | Ty.TensorTy[] => !ON.gRealTy
74              | Ty.TensorTy[n] => CL.T_Named(CLN.vecTy n)              | Ty.TensorTy[n] => ON.vecTy n
75              | Ty.TensorTy[n, m] => CL.T_Named(CLN.matTy(n,m))              | Ty.TensorTy[n, m] => ON.matTy(n,m)
76              | Ty.TensorTy dd => CL.T_Array(!CLN.gRealTy, SOME(List.foldl Int.* 1 dd))              | Ty.TensorTy dd => CL.T_Array(!ON.gRealTy, SOME(List.foldl Int.* 1 dd))
77              | Ty.SeqTy(Ty.IntTy, n) => CL.T_Named(CLN.ivecTy n)              | Ty.SeqTy(Ty.IntTy, n) => ON.ivecTy n
78              | Ty.SeqTy(Ty.TensorTy[] , n) => CL.T_Named(CLN.vecTy n)              | Ty.SeqTy(Ty.TensorTy[] , n) => ON.vecTy n
79              | Ty.SeqTy(ty, n) => CL.T_Array(toGPUType ty, SOME n)              | Ty.SeqTy(ty, n) => CL.T_Array(toGPUType ty, SOME n)
80              | Ty.AddrTy info => imageDataPtrTy info              | Ty.AddrTy info => imageDataPtrTy info
81              | Ty.ImageTy info => CL.T_Named(RN.imageTy(ImageInfo.dim info))              | Ty.ImageTy info => CN.imagePtrTy(ImageInfo.dim info)
82              | _ => raise Fail(concat["CLTyTranslate.toCPUType(", Ty.toString ty, ")"])              | _ => raise Fail(concat["CLTyTranslate.toCPUType(", Ty.toString ty, ")"])
83            (* end case *))            (* end case *))
84    
     fun subscript (e, i) = CL.mkSubscript(e, CL.mkInt(IntInf.fromInt i))  
   
 (* we might want to use memcpy in some cases  
     fun copy (ty, dst, src) = let  
           fun assign () = CL.mkAssign(dst, src)  
           fun addrOf (CL.E_UnOp(CL.%*, x)) = x  
             | addrOf x = CL.mkUnOp(CL.%&, x)  
           fun memcpy () = CL.mkCall("memcpy", [addrOf dst, addrOf src, CL.mkSizeof(trType ty)])  
           in  
             case ty  
              of Ty.BoolTy => assign()  
               | Ty.StringTy => CL.mkCall("strcpy", [addrOf dst, addrOf src])  
               | Ty.IntTy => assign()  
               | Ty.TensorTy[] => assign()  
               | Ty.TensorTy _ => memcpy()  
               | Ty.SeqTy _ => memcpy()  
               | Ty.DynSeqTy _ => raise Fail "dynamic sequence"  
               | Ty.ImageTy _ => raise Fail "unexpected image copy"  
               | _ => raise Fail(concat["bogus input type ", Ty.toString ty])  
             (* end case *)  
           end  
 *)  
   
85    (* translate a type to its GPU-side output type *)    (* translate a type to its GPU-side output type *)
86      fun toOutputType ty = (case ty      fun toOutputType ty = (case ty
87             of Ty.BoolTy => (CL.T_Named "uint8", 1)             of Ty.BoolTy => (CL.T_Named "uint8", 1)
88              | Ty.StringTy => raise Fail "CLTyTranslate.toGPUType: StringTy"              | Ty.StringTy => raise Fail "CLTyTranslate.toGPUType: StringTy"
89              | Ty.IntTy => (!CLN.gIntTy, 1)              | Ty.IntTy => (!ON.gIntTy, 1)
90              | Ty.TensorTy shape => (!CLN.gRealTy, List.foldl Int.* 1 shape)              | Ty.TensorTy shape => (!ON.gRealTy, List.foldl Int.* 1 shape)
91              | _ => raise Fail(concat["CLTyTranslate.toOutputType(", Ty.toString ty, ")"])              | _ => raise Fail(concat["CLTyTranslate.toOutputType(", Ty.toString ty, ")"])
92            (* end case *))            (* end case *))
93    
94        fun subscript (e, i) = CL.mkSubscript(e, CL.mkInt(IntInf.fromInt i))
95    
96    (* generate code to copy values from their internal Diderot representation to their    (* generate code to copy values from their internal Diderot representation to their
97     * output buffer representation.     * output buffer representation.
98     *)     *)
# Line 130  Line 104 
104              | Ty.TensorTy[n] =>              | Ty.TensorTy[n] =>
105                  List.tabulate (n,                  List.tabulate (n,
106                    fn i => CL.mkAssign(subscript(dst, i), CL.mkSelect(src, "s" ^ Int.toString i)))                    fn i => CL.mkAssign(subscript(dst, i), CL.mkSelect(src, "s" ^ Int.toString i)))
107  (*              | _ => raise Fail(concat["CLTyTranslate.copyToOutput(", Ty.toString ty, ")"])
             | Ty.TensorTy[n, m] => List.concat(List.tabulate(n,  
                 fn i => List.tabulate (m,  
                   fn j => CL.mkAssign(  
                     subscript (dst, i*m + j),  
                     subscript(CL.mkSelect(subscript (src, i), "r"), j)))))  
             | Ty.TensorTy[n, m, l] => List.concat(List.tabulate(n,  
                 fn i => List.concat(List.tabulate (m,  
                   fn j => List.tabulate (l,  
                     fn k => CL.mkAssign(  
                       subscript(dst, i*m*l + j*l + k),  
                       subscript(CL.mkSelect(subscript(subscript(src, i), j), "r"), j)))))))  
             | Ty.SeqTy(Ty.IntTy, n) => List.tabulate (n,  
                 fn i => CL.mkAssign(  
                   subscript (dst, i),  
                   subscript (CL.mkSelect(src, "i"), i)))  
             | Ty.SeqTy(ty, n) =>  
             | Ty.DynSeqTy _ =>  
             | Ty.AddrTy info =>  
             | Ty.ImageTy info =>  
 *)  
             | _ => raise Fail(concat["CLTyTranslate.copyToC(", Ty.toString ty, ")"])  
           (* end case *))  
   
   (* generate code to copy values from their shadow representation to the internal  
    * Diderot representation.  
    *)  
     fun copyFromCPU {ty, dst, src} = (case ty  
            of Ty.BoolTy => [CL.mkAssign(dst, src)]  
             | Ty.StringTy => [CL.mkAssign(dst, src)]  
             | Ty.IntTy => [CL.mkAssign(dst, src)]  
             | Ty.TensorTy[] => [CL.mkAssign(dst, src)]  
             | Ty.TensorTy[n] => [CL.mkAssign(  
                 dst,  
                 CL.mkApply(RN.mkVec n, List.tabulate(n, fn i => subscript(src, i))))]  
             | Ty.TensorTy[n, m] => List.tabulate(n,  
                 fn i => CL.mkAssign(  
                   CL.mkSelect(subscript(dst, i), "v"),  
                   CL.mkApply(RN.mkVec n, List.tabulate(n, fn j => subscript(src, i*m + j)))))  
             | Ty.TensorTy[n, m, l] => List.concat(List.tabulate(n,  
                 fn i => List.tabulate (m,  
                   fn j => CL.mkAssign(  
                     CL.mkSelect(subscript(subscript(dst, i), j), "v"),  
                     CL.mkApply(RN.mkVec n,  
                       List.tabulate(n, fn k => subscript(src, i*m*l + j*l + k)))))))  
             | Ty.SeqTy(Ty.IntTy, n) => [  
                   CL.mkAssign(  
                     CL.mkSelect(dst, "v"),  
                     CL.mkApply(CNames.mkIVec n, List.tabulate(n, fn i => subscript(src, i))))  
                 ]  
 (* do we make the following types externally visible?  
             | Ty.SeqTy(ty, n) =>  
             | Ty.DynSeqTy _ =>  
             | Ty.AddrTy info =>  
             | Ty.ImageTy info =>  
 *)  
             | _ => raise Fail(concat["CLTyTranslate.copyToC(", Ty.toString ty, ")"])  
108            (* end case *))            (* end case *))
109    
110    end    end

Legend:
Removed from v.3094  
changed lines
  Added in v.3095

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0