-
Notifications
You must be signed in to change notification settings - Fork 9.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
95 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
#include "visionbuf.h" | ||
|
||
#include <fcntl.h> | ||
#include <assert.h> | ||
#include <stdlib.h> | ||
|
||
#ifdef __APPLE__ | ||
#include <OpenCL/cl.h> | ||
#else | ||
#include <CL/cl.h> | ||
#endif | ||
|
||
VisionBuf visionbuf_allocate(size_t len) { | ||
// const size_t alignment = 4096; | ||
// void* addr = aligned_alloc(alignment, alignment * ((len - 1) / alignment + 1)); | ||
void* addr = calloc(1, len); | ||
|
||
return (VisionBuf){ | ||
.len = len, .addr = addr, .handle = 1, .fd = -1, | ||
}; | ||
} | ||
|
||
cl_mem visionbuf_to_cl(const VisionBuf* buf, cl_device_id device_id, cl_context ctx) { | ||
// HACK because this platform is just for convenience | ||
VisionBuf *w_buf = (VisionBuf*)buf; | ||
cl_mem ret; | ||
*w_buf = visionbuf_allocate_cl(buf->len, device_id, ctx, &ret); | ||
return ret; | ||
} | ||
|
||
VisionBuf visionbuf_allocate_cl(size_t len, cl_device_id device_id, cl_context ctx, cl_mem *out_mem) { | ||
int err; | ||
assert(out_mem); | ||
|
||
#if __OPENCL_VERSION__ >= 200 | ||
void* host_ptr = | ||
clSVMAlloc(ctx, CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER, len, 0); | ||
assert(host_ptr); | ||
#else | ||
void* host_ptr = calloc(1, len); | ||
|
||
cl_command_queue q = clCreateCommandQueue(ctx, device_id, 0, &err); | ||
assert(err == 0); | ||
#endif | ||
|
||
cl_mem mem = clCreateBuffer(ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, len, host_ptr, &err); | ||
assert(err == 0); | ||
|
||
*out_mem = mem; | ||
|
||
return (VisionBuf){ | ||
.len = len, .addr = host_ptr, .handle = 0, .fd = -1, | ||
.device_id = device_id, .ctx = ctx, .buf_cl = mem, | ||
|
||
#if __OPENCL_VERSION__ < 200 | ||
.copy_q = q, | ||
#endif | ||
|
||
}; | ||
} | ||
|
||
void visionbuf_sync(const VisionBuf* buf, int dir) { | ||
int err = 0; | ||
if (!buf->buf_cl) return; | ||
|
||
#if __OPENCL_VERSION__ < 200 | ||
if (dir == VISIONBUF_SYNC_FROM_DEVICE) { | ||
err = clEnqueueReadBuffer(buf->copy_q, buf->buf_cl, CL_FALSE, 0, buf->len, buf->addr, 0, NULL, NULL); | ||
} else { | ||
err = clEnqueueWriteBuffer(buf->copy_q, buf->buf_cl, CL_FALSE, 0, buf->len, buf->addr, 0, NULL, NULL); | ||
} | ||
assert(err == 0); | ||
clFinish(buf->copy_q); | ||
#endif | ||
} | ||
|
||
void visionbuf_free(const VisionBuf* buf) { | ||
if (buf->handle) { | ||
free(buf->addr); | ||
} else { | ||
int err = clReleaseMemObject(buf->buf_cl); | ||
assert(err == 0); | ||
#if __OPENCL_VERSION__ >= 200 | ||
clSVMFree(buf->ctx, buf->addr); | ||
#else | ||
free(buf->addr); | ||
#endif | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters