factor/extra/opencl/ffi/ffi-tests.factor

75 lines
2.8 KiB
Factor
Raw Normal View History

2010-03-03 03:02:47 -05:00
! Copyright (C) 2010 Erik Charlebois.
! See http://factorcode.org/license.txt for BSD license.
USING: tools.test opencl.ffi multiline locals kernel io.encodings.ascii
io.encodings.string sequences libc alien.c-types destructors math
specialized-arrays alien.data math.order alien ;
2010-03-03 03:02:47 -05:00
FROM: alien.c-types => float ;
SPECIALIZED-ARRAYS: float void* ;
2010-03-03 03:02:47 -05:00
IN: opencl.ffi.tests
STRING: kernel-source
__kernel void square(
2010-03-03 03:02:47 -05:00
__global float* input,
__global float* output,
const unsigned int count)
{
int i = get_global_id(0);
if (i < count)
output[i] = input[i] * input[i];
}
;
ERROR: cl-error err ;
: cl-success ( err -- )
dup CL_SUCCESS = [ drop ] [ cl-error ] if ;
:: cl-string-array ( str -- alien )
str ascii encode 0 suffix :> str-buffer
str-buffer length malloc &free :> str-alien
str-alien str-buffer dup length memcpy str-alien ;
:: opencl-square ( in -- out )
2010-10-20 18:42:53 -04:00
0 f 0 uint <ref> [ clGetPlatformIDs cl-success ] keep uint deref
dup void* <c-array> [ f clGetPlatformIDs cl-success ] keep first
2010-10-25 14:22:50 -04:00
CL_DEVICE_TYPE_DEFAULT 1 f void* <ref> [ f clGetDeviceIDs cl-success ] keep void* deref :> device-id
f 1 device-id void* <ref> f f 0 int <ref> [ clCreateContext ] keep int deref cl-success :> context
2010-10-20 18:42:53 -04:00
context device-id 0 0 int <ref> [ clCreateCommandQueue ] keep int deref cl-success :> queue
2010-03-03 03:02:47 -05:00
[
2010-10-25 14:22:50 -04:00
context 1 kernel-source cl-string-array void* <ref>
2010-10-20 18:42:53 -04:00
f 0 int <ref> [ clCreateProgramWithSource ] keep int deref cl-success
2010-03-03 03:02:47 -05:00
[ 0 f f f f clBuildProgram cl-success ]
2010-10-20 18:42:53 -04:00
[ "square" cl-string-array 0 int <ref> [ clCreateKernel ] keep int deref cl-success ]
2010-03-03 03:02:47 -05:00
[ ] tri
] with-destructors :> ( kernel program )
context CL_MEM_READ_ONLY in byte-length f
2010-10-20 18:42:53 -04:00
0 int <ref> [ clCreateBuffer ] keep int deref cl-success :> input
2010-03-03 03:02:47 -05:00
context CL_MEM_WRITE_ONLY in byte-length f
2010-10-20 18:42:53 -04:00
0 int <ref> [ clCreateBuffer ] keep int deref cl-success :> output
2010-03-03 03:02:47 -05:00
queue input CL_TRUE 0 in byte-length in 0 f f clEnqueueWriteBuffer cl-success
2010-10-25 14:22:50 -04:00
kernel 0 cl_mem heap-size input void* <ref> clSetKernelArg cl-success
kernel 1 cl_mem heap-size output void* <ref> clSetKernelArg cl-success
2010-10-20 18:42:53 -04:00
kernel 2 uint heap-size in length uint <ref> clSetKernelArg cl-success
2010-03-03 03:02:47 -05:00
2010-10-20 18:42:53 -04:00
queue kernel 1 f in length ulonglong <ref> f
2010-03-03 03:02:47 -05:00
0 f f clEnqueueNDRangeKernel cl-success
queue clFinish cl-success
queue output CL_TRUE 0 in byte-length in length float <c-array>
2010-03-03 03:02:47 -05:00
[ 0 f f clEnqueueReadBuffer cl-success ] keep
input clReleaseMemObject cl-success
output clReleaseMemObject cl-success
program clReleaseProgram cl-success
kernel clReleaseKernel cl-success
queue clReleaseCommandQueue cl-success
context clReleaseContext cl-success ;
[ float-array{ 1.0 4.0 9.0 16.0 100.0 } ]
[ float-array{ 1.0 2.0 3.0 4.0 10.0 } opencl-square ] unit-test