本文整理汇总了Golang中gocl/cl.CL_size_t函数的典型用法代码示例。如果您正苦于以下问题:Golang CL_size_t函数的具体用法?Golang CL_size_t怎么用?Golang CL_size_t使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了CL_size_t函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: Read_image_data
func Read_image_data(filename string) (data []uint16, w, h cl.CL_size_t, err error) {
reader, err1 := os.Open(filename)
if err1 != nil {
return nil, 0, 0, errors.New("Can't read input image file: " + filename)
}
defer reader.Close()
m, _, err2 := image.Decode(reader)
if err2 != nil {
return nil, 0, 0, errors.New("Can't decode input image file")
}
bounds := m.Bounds()
w = cl.CL_size_t(bounds.Max.X - bounds.Min.X)
h = cl.CL_size_t(bounds.Max.Y - bounds.Min.Y)
/* Allocate memory and read image data */
data = make([]uint16, h*w)
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
for x := bounds.Min.X; x < bounds.Max.X; x++ {
r, _, _, _ := m.At(x, y).RGBA()
data[(y-bounds.Min.Y)*int(w)+(x-bounds.Min.X)] = uint16(r)
}
}
return data, w, h, err
}
示例2: Load_programsource
/* Create program from a file and compile it */
func Load_programsource(filename string) ([][]byte, []cl.CL_size_t) {
var program_buffer [1][]byte
var program_size [1]cl.CL_size_t
/* Read each program file and place content into buffer array */
program_handle, err1 := os.Open(filename)
if err1 != nil {
fmt.Printf("Couldn't find the program file %s\n", filename)
return nil, nil
}
defer program_handle.Close()
fi, err2 := program_handle.Stat()
if err2 != nil {
fmt.Printf("Couldn't find the program stat\n")
return nil, nil
}
program_size[0] = cl.CL_size_t(fi.Size())
program_buffer[0] = make([]byte, program_size[0])
read_size, err3 := program_handle.Read(program_buffer[0])
if err3 != nil || cl.CL_size_t(read_size) != program_size[0] {
fmt.Printf("read file error or file size wrong\n")
return nil, nil
}
return program_buffer[:], program_size[:]
}
示例3: Build_program
/* Create program from a file and compile it */
func Build_program(context cl.CL_context, device []cl.CL_device_id,
filename string, options []byte) *cl.CL_program {
var program cl.CL_program
//var program_handle;
var program_buffer [1][]byte
var program_log interface{}
var program_size [1]cl.CL_size_t
var log_size cl.CL_size_t
var err cl.CL_int
/* Read each program file and place content into buffer array */
program_handle, err1 := os.Open(filename)
if err1 != nil {
fmt.Printf("Couldn't find the program file %s\n", filename)
return nil
}
defer program_handle.Close()
fi, err2 := program_handle.Stat()
if err2 != nil {
fmt.Printf("Couldn't find the program stat\n")
return nil
}
program_size[0] = cl.CL_size_t(fi.Size())
program_buffer[0] = make([]byte, program_size[0])
read_size, err3 := program_handle.Read(program_buffer[0])
if err3 != nil || cl.CL_size_t(read_size) != program_size[0] {
fmt.Printf("read file error or file size wrong\n")
return nil
}
/* Create a program containing all program content */
program = cl.CLCreateProgramWithSource(context, 1,
program_buffer[:], program_size[:], &err)
if err < 0 {
fmt.Printf("Couldn't create the program\n")
}
/* Build program */
err = cl.CLBuildProgram(program, 1, device[:], options, nil, nil)
if err < 0 {
/* Find size of log and print to std output */
cl.CLGetProgramBuildInfo(program, device[0], cl.CL_PROGRAM_BUILD_LOG,
0, nil, &log_size)
cl.CLGetProgramBuildInfo(program, device[0], cl.CL_PROGRAM_BUILD_LOG,
log_size, &program_log, nil)
fmt.Printf("%s\n", program_log)
return nil
}
return &program
}
示例4: cpuInitSearchKeys
func cpuInitSearchKeys(commandQueue cl.CL_command_queue,
svmSearchBuf unsafe.Pointer) {
var nextData *searchKey
var status cl.CL_int
status = cl.CLEnqueueSVMMap(commandQueue,
cl.CL_TRUE, //blocking call
cl.CL_MAP_WRITE_INVALIDATE_REGION,
svmSearchBuf,
cl.CL_size_t(NUMBER_OF_SEARCH_KEY*unsafe.Sizeof(sampleKey)),
0,
nil,
nil)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "clEnqueueSVMMap(svmSearchBuf)")
r := rand.New(rand.NewSource(999))
// initialize nodes
for i := 0; i < NUMBER_OF_SEARCH_KEY; i++ {
nextData = (*searchKey)(unsafe.Pointer(uintptr(svmSearchBuf) + uintptr(i)*unsafe.Sizeof(sampleKey)))
// allocate a random value to node
nextData.key = cl.CL_int(r.Int())
// all pointers are null
nextData.oclNode = nil
nextData.nativeNode = nil
}
status = cl.CLEnqueueSVMUnmap(commandQueue,
svmSearchBuf,
0,
nil,
nil)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "clEnqueueSVMUnmap(svmSearchBuf)")
}
示例5: svmCompareResults
func svmCompareResults(commandQueue cl.CL_command_queue,
svmSearchBuf unsafe.Pointer) bool {
var compare_status bool
var status cl.CL_int
status = cl.CLEnqueueSVMMap(commandQueue,
cl.CL_TRUE, //blocking call
cl.CL_MAP_WRITE_INVALIDATE_REGION,
svmSearchBuf,
cl.CL_size_t(NUMBER_OF_SEARCH_KEY*unsafe.Sizeof(sampleKey)),
0,
nil,
nil)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "clEnqueueSVMMap(svmSearchBuf)")
compare_status = true
for i := 0; i < NUMBER_OF_SEARCH_KEY; i++ {
currKey := (*searchKey)(unsafe.Pointer(uintptr(svmSearchBuf) + uintptr(i)*unsafe.Sizeof(sampleKey)))
/* compare OCL and native nodes */
if currKey.oclNode != currKey.nativeNode {
compare_status = false
break
}
}
status = cl.CLEnqueueSVMUnmap(commandQueue,
svmSearchBuf,
0,
nil,
nil)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "clEnqueueSVMUnmap(svmSearchBuf)")
return compare_status
}
示例6: cpuCreateBinaryTree
/**
* cpuCreateBinaryTree()
* creates a tree from the data in "svmTreeBuf". If this is NULL returns NULL
* else returns root of the tree.
**/
func cpuCreateBinaryTree(commandQueue cl.CL_command_queue,
svmTreeBuf unsafe.Pointer) *node {
var root *node
var status cl.CL_int
// reserve svm space for CPU update
status = cl.CLEnqueueSVMMap(commandQueue,
cl.CL_TRUE, //blocking call
cl.CL_MAP_WRITE_INVALIDATE_REGION,
svmTreeBuf,
cl.CL_size_t(NUMBER_OF_NODES*unsafe.Sizeof(sampleNode)),
0,
nil,
nil)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "clEnqueueSVMMap(svmTreeBuf)")
//init node and make bt
root = cpuMakeBinaryTree(svmTreeBuf)
status = cl.CLEnqueueSVMUnmap(commandQueue,
svmTreeBuf,
0,
nil,
nil)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "clEnqueueSVMUnmap(svmTreeBuf)")
return root
}
示例7: main
func main() {
/* Host/device data structures */
var platform [1]cl.CL_platform_id
var device [1]cl.CL_device_id
var flag interface{} //cl.CL_device_fp_config;
var err cl.CL_int
/* Identify a platform */
err = cl.CLGetPlatformIDs(1, platform[:], nil)
if err < 0 {
println("Couldn't identify a platform")
return
}
/* Access a device */
err = cl.CLGetDeviceIDs(platform[0], cl.CL_DEVICE_TYPE_GPU, 1, device[:], nil)
if err == cl.CL_DEVICE_NOT_FOUND {
err = cl.CLGetDeviceIDs(platform[0], cl.CL_DEVICE_TYPE_CPU, 1, device[:], nil)
}
if err < 0 {
println("Couldn't access any devices")
return
}
/* Check float-processing features */
err = cl.CLGetDeviceInfo(device[0], cl.CL_DEVICE_SINGLE_FP_CONFIG,
cl.CL_size_t(unsafe.Sizeof(flag)), &flag, nil)
if err < 0 {
println("Couldn't read floating-point properties")
return
}
fmt.Printf("Float Processing Features:\n")
if (flag.(cl.CL_device_fp_config) & cl.CL_FP_INF_NAN) > 0 {
fmt.Printf("INF and NaN values supported.\n")
}
if (flag.(cl.CL_device_fp_config) & cl.CL_FP_DENORM) > 0 {
fmt.Printf("Denormalized numbers supported.\n")
}
if (flag.(cl.CL_device_fp_config) & cl.CL_FP_ROUND_TO_NEAREST) > 0 {
fmt.Printf("Round To Nearest Even mode supported.\n")
}
if (flag.(cl.CL_device_fp_config) & cl.CL_FP_ROUND_TO_INF) > 0 {
fmt.Printf("Round To Infinity mode supported.\n")
}
if (flag.(cl.CL_device_fp_config) & cl.CL_FP_ROUND_TO_ZERO) > 0 {
fmt.Printf("Round To Zero mode supported.\n")
}
if (flag.(cl.CL_device_fp_config) & cl.CL_FP_FMA) > 0 {
fmt.Printf("Floating-point multiply-and-add operation supported.\n")
}
if (flag.(cl.CL_device_fp_config) & cl.CL_FP_SOFT_FLOAT) > 0 {
fmt.Printf("Basic floating-point processing performed in software.\n")
}
}
示例8: main
func main() {
var i, j cl.CL_size_t
// Rows and columns in the input image
inputFile := "test.png"
outputFile := "output.png"
refFile := "ref.png"
// Homegrown function to read a BMP from file
inputpixels, imageWidth, imageHeight, err1 := utils.Read_image_data(inputFile)
if err1 != nil {
log.Fatal(err1)
return
} else {
fmt.Printf("width=%d, height=%d (%d)\n", imageWidth, imageHeight, inputpixels[0])
}
// Output image on the host
outputpixels := make([]uint16, imageHeight*imageWidth)
inputImage := make([]float32, imageHeight*imageWidth)
outputImage := make([]float32, imageHeight*imageWidth)
refImage := make([]float32, imageHeight*imageWidth)
for i = 0; i < imageHeight*imageWidth; i++ {
inputImage[i] = float32(inputpixels[i])
}
// 45 degree motion blur
var filter = [49]float32{0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, -1, 0, 1, 0, 0,
0, 0, -2, 0, 2, 0, 0,
0, 0, -1, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0}
// The convolution filter is 7x7
filterWidth := cl.CL_size_t(7)
filterSize := cl.CL_size_t(filterWidth * filterWidth) // Assume a square kernel
// Set up the OpenCL environment
var status cl.CL_int
// Discovery platform
var platform [1]cl.CL_platform_id
status = cl.CLGetPlatformIDs(1, platform[:], nil)
chk(status, "clGetPlatformIDs")
// Discover device
var device [1]cl.CL_device_id
cl.CLGetDeviceIDs(platform[0], cl.CL_DEVICE_TYPE_ALL, 1, device[:], nil)
chk(status, "clGetDeviceIDs")
// Create context
//var props =[3]cl.CL_context_properties{cl.CL_CONTEXT_PLATFORM,
// (cl.CL_context_properties)(unsafe.Pointer(&platform[0])), 0};
var context cl.CL_context
context = cl.CLCreateContext(nil, 1, device[:], nil, nil, &status)
chk(status, "clCreateContext")
// Create command queue
var queue cl.CL_command_queue
queue = cl.CLCreateCommandQueue(context, device[0], 0, &status)
chk(status, "clCreateCommandQueue")
// The image format describes how the data will be stored in memory
var format cl.CL_image_format
format.Image_channel_order = cl.CL_R // single channel
format.Image_channel_data_type = cl.CL_FLOAT // float data type
var desc cl.CL_image_desc
desc.Image_type = cl.CL_MEM_OBJECT_IMAGE2D
desc.Image_width = imageWidth
desc.Image_height = imageHeight
desc.Image_depth = 0
desc.Image_array_size = 0
desc.Image_row_pitch = 0
desc.Image_slice_pitch = 0
desc.Num_mip_levels = 0
desc.Num_samples = 0
desc.Buffer = cl.CL_mem{}
// Create space for the source image on the device
d_inputImage := cl.CLCreateImage(context, cl.CL_MEM_READ_ONLY, &format, &desc,
nil, &status)
chk(status, "clCreateImage")
// Create space for the output image on the device
d_outputImage := cl.CLCreateImage(context, cl.CL_MEM_WRITE_ONLY, &format, &desc,
nil, &status)
chk(status, "clCreateImage")
// Create space for the 7x7 filter on the device
d_filter := cl.CLCreateBuffer(context, 0, filterSize*cl.CL_size_t(unsafe.Sizeof(filter[0])),
nil, &status)
chk(status, "clCreateBuffer")
// Copy the source image to the device
var origin = [3]cl.CL_size_t{0, 0, 0} // Offset within the image to copy from
var region = [3]cl.CL_size_t{cl.CL_size_t(imageWidth), cl.CL_size_t(imageHeight), 1} // Elements to per dimension
//.........这里部分代码省略.........
示例9: TestQueue
func TestQueue(t *testing.T) {
/* Host/device data structures */
var platforms []ocl.Platform
var devices []ocl.Device
var context ocl.Context
var queue ocl.CommandQueue
var err error
var ref_count interface{}
/* Identify a platform */
if platforms, err = ocl.GetPlatforms(); err != nil {
t.Errorf(err.Error())
return
}
/* Determine connected devices */
if devices, err = platforms[0].GetDevices(cl.CL_DEVICE_TYPE_GPU); err != nil {
if devices, err = platforms[0].GetDevices(cl.CL_DEVICE_TYPE_CPU); err != nil {
t.Errorf(err.Error())
return
}
}
devices = devices[0:1]
/* Create the context */
if context, err = devices[0].CreateContext(nil, nil, nil); err != nil {
t.Errorf(err.Error())
return
}
defer context.Release()
/* Create the command queue */
if queue, err = context.CreateCommandQueue(devices[0], nil); err != nil {
t.Errorf(err.Error())
return
}
defer queue.Release()
/* Get the reference count */
if ref_count, err = queue.GetInfo(cl.CL_QUEUE_REFERENCE_COUNT); err != nil {
t.Errorf(err.Error())
return
}
t.Logf("Initial reference count: %d\n", ref_count.(cl.CL_uint))
/* Update and display the reference count */
queue.Retain()
if ref_count, err = queue.GetInfo(cl.CL_QUEUE_REFERENCE_COUNT); err != nil {
t.Errorf(err.Error())
return
}
t.Logf("Reference count: %d\n", ref_count.(cl.CL_uint))
queue.Release()
if ref_count, err = queue.GetInfo(cl.CL_QUEUE_REFERENCE_COUNT); err != nil {
t.Errorf(err.Error())
return
}
t.Logf("Reference count: %d\n", ref_count.(cl.CL_uint))
/* Program/kernel data structures */
var program ocl.Program
var program_size [1]cl.CL_size_t
var program_buffer [1][]byte
var program_log interface{}
/* Read each program file and place content into buffer array */
program_handle, err1 := os.Open("blank.cl")
if err1 != nil {
t.Errorf(err1.Error())
return
}
defer program_handle.Close()
fi, err2 := program_handle.Stat()
if err2 != nil {
t.Errorf(err2.Error())
return
}
program_size[0] = cl.CL_size_t(fi.Size())
program_buffer[0] = make([]byte, program_size[0])
read_size, err3 := program_handle.Read(program_buffer[0])
if err3 != nil || cl.CL_size_t(read_size) != program_size[0] {
t.Errorf("read file error or file size wrong")
return
}
// Create program from file
if program, err = context.CreateProgramWithSource(1, program_buffer[:], program_size[:]); err != nil {
t.Errorf(err.Error())
return
}
defer program.Release()
/* Build program */
if err = program.Build(devices, nil, nil, nil); err != nil {
t.Errorf(err.Error())
/* Find size of log and print to std output */
if program_log, err = program.GetBuildInfo(devices[0], cl.CL_PROGRAM_BUILD_LOG); err != nil {
//.........这里部分代码省略.........
示例10: main
func main() {
// This code executes on the OpenCL host
// Host data
var size cl.CL_int
var A []cl.CL_int //input array
var B []cl.CL_int //input array
var C []cl.CL_int //output array
// Elements in each array
const elements = cl.CL_size_t(2048)
// Compute the size of the data
datasize := cl.CL_size_t(unsafe.Sizeof(size)) * elements
// Allocate space for input/output data
A = make([]cl.CL_int, datasize)
B = make([]cl.CL_int, datasize)
C = make([]cl.CL_int, datasize)
// Initialize the input data
for i := cl.CL_int(0); i < cl.CL_int(elements); i++ {
A[i] = i
B[i] = i
}
// Use this to check the output of each API call
var status cl.CL_int
//-----------------------------------------------------
// STEP 1: Discover and initialize the platforms
//-----------------------------------------------------
var numPlatforms cl.CL_uint
var platforms []cl.CL_platform_id
// Use clGetPlatformIDs() to retrieve the number of
// platforms
status = cl.CLGetPlatformIDs(0, nil, &numPlatforms)
// Allocate enough space for each platform
platforms = make([]cl.CL_platform_id, numPlatforms)
// Fill in platforms with clGetPlatformIDs()
status = cl.CLGetPlatformIDs(numPlatforms, platforms, nil)
if status != cl.CL_SUCCESS {
println("CLGetPlatformIDs status!=cl.CL_SUCCESS")
return
}
//-----------------------------------------------------
// STEP 2: Discover and initialize the devices
//-----------------------------------------------------
var numDevices cl.CL_uint
var devices []cl.CL_device_id
// Use clGetDeviceIDs() to retrieve the number of
// devices present
status = cl.CLGetDeviceIDs(platforms[0],
cl.CL_DEVICE_TYPE_ALL,
0,
nil,
&numDevices)
if status != cl.CL_SUCCESS {
println("CLGetDeviceIDs status!=cl.CL_SUCCESS")
return
}
// Allocate enough space for each device
devices = make([]cl.CL_device_id, numDevices)
// Fill in devices with clGetDeviceIDs()
status = cl.CLGetDeviceIDs(platforms[0],
cl.CL_DEVICE_TYPE_ALL,
numDevices,
devices,
nil)
if status != cl.CL_SUCCESS {
println("CLGetDeviceIDs status!=cl.CL_SUCCESS")
return
}
//-----------------------------------------------------
// STEP 3: Create a context
//-----------------------------------------------------
var context cl.CL_context
// Create a context using clCreateContext() and
// associate it with the devices
context = cl.CLCreateContext(nil,
numDevices,
devices,
nil,
nil,
&status)
if status != cl.CL_SUCCESS {
println("CLCreateContext status!=cl.CL_SUCCESS")
return
}
//-----------------------------------------------------
// STEP 4: Create a command queue
//.........这里部分代码省略.........
示例11: main
func main() {
/* OpenCL data structures */
var device []cl.CL_device_id
var context cl.CL_context
var queue cl.CL_command_queue
var program *cl.CL_program
var kernel cl.CL_kernel
var err cl.CL_int
/* Data and buffers */
var select1 [4]float32
var select2 [2]cl.CL_uchar
var select1_buffer, select2_buffer cl.CL_mem
/* Create a context */
device = utils.Create_device()
context = cl.CLCreateContext(nil, 1, device[:], nil, nil, &err)
if err < 0 {
println("Couldn't create a context")
return
}
/* Create a kernel */
program = utils.Build_program(context, device[:], PROGRAM_FILE, nil)
kernel = cl.CLCreateKernel(*program, KERNEL_FUNC, &err)
if err < 0 {
println("Couldn't create a kernel")
return
}
/* Create a write-only buffer to hold the output data */
select1_buffer = cl.CLCreateBuffer(context, cl.CL_MEM_WRITE_ONLY,
cl.CL_size_t(unsafe.Sizeof(select1)), nil, &err)
if err < 0 {
println("Couldn't create a buffer")
return
}
select2_buffer = cl.CLCreateBuffer(context, cl.CL_MEM_WRITE_ONLY,
cl.CL_size_t(unsafe.Sizeof(select2)), nil, &err)
/* Create kernel argument */
err = cl.CLSetKernelArg(kernel, 0, cl.CL_size_t(unsafe.Sizeof(select1_buffer)), unsafe.Pointer(&select1_buffer))
if err < 0 {
println("Couldn't set a kernel argument")
return
}
cl.CLSetKernelArg(kernel, 1, cl.CL_size_t(unsafe.Sizeof(select2_buffer)), unsafe.Pointer(&select2_buffer))
/* Create a command queue */
queue = cl.CLCreateCommandQueue(context, device[0], 0, &err)
if err < 0 {
println("Couldn't create a command queue")
return
}
/* Enqueue kernel */
err = cl.CLEnqueueTask(queue, kernel, 0, nil, nil)
if err < 0 {
println("Couldn't enqueue the kernel")
return
}
/* Read and print the result */
err = cl.CLEnqueueReadBuffer(queue, select1_buffer, cl.CL_TRUE, 0,
cl.CL_size_t(unsafe.Sizeof(select1)), unsafe.Pointer(&select1), 0, nil, nil)
if err < 0 {
println("Couldn't read the buffer")
return
}
cl.CLEnqueueReadBuffer(queue, select2_buffer, cl.CL_TRUE, 0,
cl.CL_size_t(unsafe.Sizeof(select2)), unsafe.Pointer(&select2), 0, nil, nil)
fmt.Printf("select: ")
for i := 0; i < 3; i++ {
fmt.Printf("%.2f, ", select1[i])
}
fmt.Printf("%.2f\n", select1[3])
fmt.Printf("bitselect: %X, %X\n", select2[0], select2[1])
/* Deallocate resources */
cl.CLReleaseMemObject(select1_buffer)
cl.CLReleaseMemObject(select2_buffer)
cl.CLReleaseKernel(kernel)
cl.CLReleaseCommandQueue(queue)
cl.CLReleaseProgram(*program)
cl.CLReleaseContext(context)
}
示例12: main
func main() {
/* OpenCL data structures */
var device []cl.CL_device_id
var context cl.CL_context
var queue cl.CL_command_queue
var program *cl.CL_program
var kernel cl.CL_kernel
var err cl.CL_int
/* Data and buffers */
var a float32 = 6.0
var b float32 = 2.0
var result float32
var a_buffer, b_buffer, output_buffer cl.CL_mem
/* Extension data */
var sizeofuint cl.CL_uint
var addr_data interface{}
var ext_data interface{}
fp64_ext := "cl_khr_fp64"
var ext_size cl.CL_size_t
var options []byte
/* Create a device and context */
device = utils.Create_device()
context = cl.CLCreateContext(nil, 1, device[:], nil, nil, &err)
if err < 0 {
println("Couldn't create a context")
return
}
/* Obtain the device data */
if cl.CLGetDeviceInfo(device[0], cl.CL_DEVICE_ADDRESS_BITS,
cl.CL_size_t(unsafe.Sizeof(sizeofuint)), &addr_data, nil) < 0 {
println("Couldn't read extension data")
return
}
fmt.Printf("Address width: %v\n", addr_data.(cl.CL_uint))
/* Define "FP_64" option if doubles are supported */
cl.CLGetDeviceInfo(device[0], cl.CL_DEVICE_EXTENSIONS,
0, nil, &ext_size)
// ext_data = (char*)malloc(ext_size + 1);
// ext_data[ext_size] = '\0';
cl.CLGetDeviceInfo(device[0], cl.CL_DEVICE_EXTENSIONS,
ext_size, &ext_data, nil)
if strings.Contains(ext_data.(string), fp64_ext) {
fmt.Printf("The %s extension is supported.\n", fp64_ext)
options = []byte("-DFP_64 ")
} else {
fmt.Printf("The %s extension is not supported. %s\n", fp64_ext, ext_data.(string))
}
/* Build the program and create the kernel */
program = utils.Build_program(context, device[:], PROGRAM_FILE, options)
kernel = cl.CLCreateKernel(*program, KERNEL_FUNC, &err)
if err < 0 {
println("Couldn't create a kernel")
return
}
/* Create CL buffers to hold input and output data */
a_buffer = cl.CLCreateBuffer(context, cl.CL_MEM_READ_ONLY|
cl.CL_MEM_COPY_HOST_PTR, cl.CL_size_t(unsafe.Sizeof(a)), unsafe.Pointer(&a), &err)
if err < 0 {
println("Couldn't create a memory object")
return
}
b_buffer = cl.CLCreateBuffer(context, cl.CL_MEM_READ_ONLY|
cl.CL_MEM_COPY_HOST_PTR, cl.CL_size_t(unsafe.Sizeof(b)), unsafe.Pointer(&b), nil)
output_buffer = cl.CLCreateBuffer(context, cl.CL_MEM_WRITE_ONLY,
cl.CL_size_t(unsafe.Sizeof(b)), nil, nil)
/* Create kernel arguments */
err = cl.CLSetKernelArg(kernel, 0, cl.CL_size_t(unsafe.Sizeof(a_buffer)), unsafe.Pointer(&a_buffer))
if err < 0 {
println("Couldn't set a kernel argument")
return
}
cl.CLSetKernelArg(kernel, 1, cl.CL_size_t(unsafe.Sizeof(b_buffer)), unsafe.Pointer(&b_buffer))
cl.CLSetKernelArg(kernel, 2, cl.CL_size_t(unsafe.Sizeof(output_buffer)), unsafe.Pointer(&output_buffer))
/* Create a command queue */
queue = cl.CLCreateCommandQueue(context, device[0], 0, &err)
if err < 0 {
println("Couldn't create a command queue")
return
}
/* Enqueue kernel */
err = cl.CLEnqueueTask(queue, kernel, 0, nil, nil)
if err < 0 {
println("Couldn't enqueue the kernel")
return
}
/* Read and print the result */
err = cl.CLEnqueueReadBuffer(queue, output_buffer, cl.CL_TRUE, 0,
//.........这里部分代码省略.........
示例13: main
func main() {
// Use this to check the output of each API call
var status cl.CL_int
//-----------------------------------------------------
// STEP 1: Discover and initialize the platforms
//-----------------------------------------------------
var numPlatforms cl.CL_uint
var platforms []cl.CL_platform_id
// Use clGetPlatformIDs() to retrieve the number of
// platforms
status = cl.CLGetPlatformIDs(0, nil, &numPlatforms)
// Allocate enough space for each platform
platforms = make([]cl.CL_platform_id, numPlatforms)
// Fill in platforms with clGetPlatformIDs()
status = cl.CLGetPlatformIDs(numPlatforms, platforms, nil)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "CLGetPlatformIDs")
//-----------------------------------------------------
// STEP 2: Discover and initialize the GPU devices
//-----------------------------------------------------
var numDevices cl.CL_uint
var devices []cl.CL_device_id
// Use clGetDeviceIDs() to retrieve the number of
// devices present
status = cl.CLGetDeviceIDs(platforms[0],
cl.CL_DEVICE_TYPE_GPU,
0,
nil,
&numDevices)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "CLGetDeviceIDs")
// Allocate enough space for each device
devices = make([]cl.CL_device_id, numDevices)
// Fill in devices with clGetDeviceIDs()
status = cl.CLGetDeviceIDs(platforms[0],
cl.CL_DEVICE_TYPE_GPU,
numDevices,
devices,
nil)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "CLGetDeviceIDs")
//-----------------------------------------------------
// STEP 3: Create a context
//-----------------------------------------------------
var context cl.CL_context
// Create a context using clCreateContext() and
// associate it with the devices
context = cl.CLCreateContext(nil,
numDevices,
devices,
nil,
nil,
&status)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "CLCreateContext")
defer cl.CLReleaseContext(context)
//-----------------------------------------------------
// STEP 4: Create a command queue
//-----------------------------------------------------
var cmdQueue cl.CL_command_queue
// Create a command queue using clCreateCommandQueueWithProperties(),
// and associate it with the device you want to execute
cmdQueue = cl.CLCreateCommandQueueWithProperties(context,
devices[0],
nil,
&status)
utils.CHECK_STATUS(status, cl.CL_SUCCESS, "CLCreateCommandQueueWithProperties")
defer cl.CLReleaseCommandQueue(cmdQueue)
//-----------------------------------------------------
// STEP 5: Create device buffers
//-----------------------------------------------------
// initialize any device/SVM memory here.
/* svm buffer for binary tree */
svmTreeBuf := cl.CLSVMAlloc(context,
cl.CL_MEM_READ_WRITE,
cl.CL_size_t(NUMBER_OF_NODES*unsafe.Sizeof(sampleNode)),
0)
if nil == svmTreeBuf {
println("clSVMAlloc(svmTreeBuf) failed.")
return
}
defer cl.CLSVMFree(context, svmTreeBuf)
/* svm buffer for search keys */
svmSearchBuf := cl.CLSVMAlloc(context,
cl.CL_MEM_READ_WRITE,
cl.CL_size_t(NUMBER_OF_SEARCH_KEY*unsafe.Sizeof(sampleKey)),
0)
if nil == svmSearchBuf {
println("clSVMAlloc(svmSearchBuf) failed.")
//.........这里部分代码省略.........
示例14: svmbasic
func svmbasic(size cl.CL_size_t,
context cl.CL_context,
queue cl.CL_command_queue,
kernel cl.CL_kernel) {
// Prepare input data as follows.
// Build two arrays:
// - an array that consists of the Element structures
// (refer to svmbasic.h for the structure definition)
// - an array that consists of the float values
//
// Each structure of the first array has the following pointers:
// - 'internal', which points to a 'value' field of another entry
// of the same array.
// - 'external', which points to a float value from the the
// second array.
//
// Pointers are set randomly. The structures do not reflect any real usage
// scenario, but are illustrative for a simple device-side traversal.
//
// Array of Element Array of floats
// structures
//
// ||====================||
// || ............. || ||============||
// || ............. ||<-----+ || .......... ||
// ||====================|| | || float ||
// || float* internal--||------+ || float ||
// || float* external--||------------------>|| float ||
// || float value <----||------+ || .......... ||
// ||====================|| | || .......... ||
// || ............. || | || float ||
// || ............. || | || float ||
// ||====================|| | || float ||
// ||====================|| | || float ||
// || float* internal--||------+ || float ||
// || float* external--||------------------>|| float ||
// || float value || || float ||
// ||====================|| || float ||
// || ............. || || .......... ||
// || ............. || ||============||
// ||====================||
//
// The two arrays are created independently and are used to illustrate
// two new OpenCL 2.0 API functions:
// - the array of Element structures is passed to the kernel as a
// kernel argument with the clSetKernelArgSVMPointer function
// - the array of floats is used by the kernel indirectly, and this
// dependency should be also specified with the clSetKernelExecInfo
// function prior to the kernel execution
var err cl.CL_int
// To enable host & device code to share pointer to the same address space
// the arrays should be allocated as SVM memory. Use the clSVMAlloc function
// to allocate SVM memory.
//
// Optionally, this function allows specifying alignment in bytes as its
// last argument. As this basic example doesn't require any _special_ alignment,
// the following code illustrates requesting default alignment via passing
// zero value.
inputElements := cl.CLSVMAlloc(context, // the context where this memory is supposed to be used
cl.CL_MEM_READ_ONLY|cl.CL_MEM_SVM_FINE_GRAIN_BUFFER,
size*cl.CL_size_t(unsafe.Sizeof(sampleElement)), // amount of memory to allocate (in bytes)
0) // alignment in bytes (0 means default)
if nil == inputElements {
println("Cannot allocate SVM memory with clSVMAlloc: it returns null pointer. You might be out of memory.")
return
}
defer cl.CLSVMFree(context, inputElements)
inputFloats := cl.CLSVMAlloc(context, // the context where this memory is supposed to be used
cl.CL_MEM_READ_ONLY|cl.CL_MEM_SVM_FINE_GRAIN_BUFFER,
size*cl.CL_size_t(unsafe.Sizeof(sampleFloat)), // amount of memory to allocate (in bytes)
0) // alignment in bytes (0 means default)
if nil == inputFloats {
println("Cannot allocate SVM memory with clSVMAlloc: it returns null pointer. You might be out of memory.")
return
}
defer cl.CLSVMFree(context, inputFloats)
// The OpenCL kernel uses the aforementioned input arrays to compute
// values for the output array.
output := cl.CLSVMAlloc(context, // the context where this memory is supposed to be used
cl.CL_MEM_WRITE_ONLY|cl.CL_MEM_SVM_FINE_GRAIN_BUFFER,
size*cl.CL_size_t(unsafe.Sizeof(sampleFloat)), // amount of memory to allocate (in bytes)
0) // alignment in bytes (0 means default)
defer cl.CLSVMFree(context, output)
if nil == output {
println("Cannot allocate SVM memory with clSVMAlloc: it returns null pointer. You might be out of memory.")
return
}
// Note: in the coarse-grained SVM, mapping of inputElement and inputFloats is
// needed to do the following initialization. While here, in the fine-grained SVM,
// it is not necessary.
// Populate data-structures with initial data.
//.........这里部分代码省略.........
示例15: main
func main() {
/* OpenCL data structures */
var device []cl.CL_device_id
var context cl.CL_context
var queue cl.CL_command_queue
var program *cl.CL_program
var kernel cl.CL_kernel
var err cl.CL_int
/* Data and events */
var data []float32
var data_buffer cl.CL_mem
var user_event, kernel_event, read_event [1]cl.CL_event
/* Initialize data */
data = make([]float32, 4)
for i := 0; i < 4; i++ {
data[i] = float32(i) * 1.0
}
/* Create a device and context */
device = utils.Create_device()
context = cl.CLCreateContext(nil, 1, device[:], nil, nil, &err)
if err < 0 {
println("Couldn't create a context")
return
}
/* Build the program and create a kernel */
program = utils.Build_program(context, device[:], PROGRAM_FILE, nil)
kernel = cl.CLCreateKernel(*program, KERNEL_FUNC, &err)
if err < 0 {
println("Couldn't create a kernel")
return
}
/* Create a buffer to hold data */
data_buffer = cl.CLCreateBuffer(context,
cl.CL_MEM_READ_WRITE|cl.CL_MEM_COPY_HOST_PTR,
cl.CL_size_t(unsafe.Sizeof(data[0]))*4, unsafe.Pointer(&data[0]), &err)
if err < 0 {
println("Couldn't create a buffer")
return
}
/* Create kernel argument */
err = cl.CLSetKernelArg(kernel, 0, cl.CL_size_t(unsafe.Sizeof(data_buffer)), unsafe.Pointer(&data_buffer))
if err < 0 {
println("Couldn't set a kernel argument")
return
}
/* Create a command queue */
queue = cl.CLCreateCommandQueue(context, device[0],
cl.CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err)
if err < 0 {
println("Couldn't create a command queue")
return
}
/* Configure events */
user_event[0] = cl.CLCreateUserEvent(context, &err)
if err < 0 {
println("Couldn't enqueue the kernel")
return
}
/* Enqueue kernel */
err = cl.CLEnqueueTask(queue, kernel, 1, user_event[:], &kernel_event[0])
if err < 0 {
println("Couldn't enqueue the kernel")
return
}
/* Read the buffer */
err = cl.CLEnqueueReadBuffer(queue, data_buffer, cl.CL_FALSE, 0,
cl.CL_size_t(unsafe.Sizeof(data[0]))*4, unsafe.Pointer(&data[0]), 1, kernel_event[:], &read_event[0])
if err < 0 {
println("Couldn't read the buffer")
return
}
/* Set callback for event */
err = cl.CLSetEventCallback(read_event[0], cl.CL_COMPLETE,
read_complete, unsafe.Pointer(&data))
if err < 0 {
println("Couldn't set callback for event")
return
}
/* Sleep for a second to demonstrate the that commands haven't
started executing. Then prompt user */
time.Sleep(1)
fmt.Printf("Old data: %4.2f, %4.2f, %4.2f, %4.2f\n",
data[0], data[1], data[2], data[3])
fmt.Printf("Press ENTER to continue.\n")
//getchar();
reader := bufio.NewReader(os.Stdin)
reader.ReadString('\n')
//.........这里部分代码省略.........