From eb294c971458dce069a5485e5c169d9ba5d30737 Mon Sep 17 00:00:00 2001 From: "Andrew Jackson (Ajax)" Date: Mon, 21 Aug 2023 16:41:00 -0500 Subject: [PATCH] opencl harmonytask another try --- lib/harmony/resources/miniopencl/cl.h | 15 ++++ .../resources/miniopencl/miniopencl.go | 87 +++++++++++++++++++ lib/harmony/resources/resources.go | 4 +- 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 lib/harmony/resources/miniopencl/cl.h create mode 100644 lib/harmony/resources/miniopencl/miniopencl.go diff --git a/lib/harmony/resources/miniopencl/cl.h b/lib/harmony/resources/miniopencl/cl.h new file mode 100644 index 000000000..5e9b25447 --- /dev/null +++ b/lib/harmony/resources/miniopencl/cl.h @@ -0,0 +1,15 @@ + +#ifndef CL_H +#define CL_H + +#define CL_USE_DEPRECATED_OPENCL_1_1_APIS +#define CL_USE_DEPRECATED_OPENCL_1_2_APIS +#define CL_USE_DEPRECATED_OPENCL_2_0_APIS + +#ifdef __APPLE__ +#include "OpenCL/opencl.h" +#else +#include "CL/opencl.h" +#endif + +#endif /* CL_H */ \ No newline at end of file diff --git a/lib/harmony/resources/miniopencl/miniopencl.go b/lib/harmony/resources/miniopencl/miniopencl.go new file mode 100644 index 000000000..6b07e1cba --- /dev/null +++ b/lib/harmony/resources/miniopencl/miniopencl.go @@ -0,0 +1,87 @@ +package cl + +// #include "cl.h" +import "C" +import ( + "fmt" + "unsafe" +) + +const maxPlatforms = 32 + +type Platform struct { + id C.cl_platform_id +} + +// Obtain the list of platforms available. +func GetPlatforms() ([]*Platform, error) { + var platformIds [maxPlatforms]C.cl_platform_id + var nPlatforms C.cl_uint + if err := C.clGetPlatformIDs(C.cl_uint(maxPlatforms), &platformIds[0], &nPlatforms); err != C.CL_SUCCESS { + return nil, toError(err) + } + platforms := make([]*Platform, nPlatforms) + for i := 0; i < int(nPlatforms); i++ { + platforms[i] = &Platform{id: platformIds[i]} + } + return platforms, nil +} + +const maxDeviceCount = 64 + +type DeviceType uint + +const ( + DeviceTypeAll DeviceType = C.CL_DEVICE_TYPE_ALL +) + +type Device struct { + id C.cl_device_id +} + +func (p *Platform) GetAllDevices() ([]*Device, error) { + var deviceIds [maxDeviceCount]C.cl_device_id + var numDevices C.cl_uint + var platformId C.cl_platform_id + if p != nil { + platformId = p.id + } + if err := C.clGetDeviceIDs(platformId, C.cl_device_type(DeviceTypeAll), C.cl_uint(maxDeviceCount), &deviceIds[0], &numDevices); err != C.CL_SUCCESS { + return nil, toError(err) + } + if numDevices > maxDeviceCount { + numDevices = maxDeviceCount + } + devices := make([]*Device, numDevices) + for i := 0; i < int(numDevices); i++ { + devices[i] = &Device{id: deviceIds[i]} + } + return devices, nil +} + +func toError(code C.cl_int) error { + return ErrOther(code) +} + +type ErrOther int + +func (e ErrOther) Error() string { + return fmt.Sprintf("cl: error %d", int(e)) +} + +// Size of global device memory in bytes. +func (d *Device) GlobalMemSize() int64 { + val, _ := d.getInfoUlong(C.CL_DEVICE_GLOBAL_MEM_SIZE, true) + return val +} + +func (d *Device) getInfoUlong(param C.cl_device_info, panicOnError bool) (int64, error) { + var val C.cl_ulong + if err := C.clGetDeviceInfo(d.id, param, C.size_t(unsafe.Sizeof(val)), unsafe.Pointer(&val), nil); err != C.CL_SUCCESS { + if panicOnError { + panic("Should never fail") + } + return 0, toError(err) + } + return int64(val), nil +} diff --git a/lib/harmony/resources/resources.go b/lib/harmony/resources/resources.go index 98d177328..94df047d8 100644 --- a/lib/harmony/resources/resources.go +++ b/lib/harmony/resources/resources.go @@ -14,12 +14,12 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/pbnjay/memory" "github.com/samber/lo" - "github.com/samuel/go-opencl/cl" "golang.org/x/sys/unix" ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/lotus/lib/harmony/harmonydb" + cl "github.com/filecoin-project/lotus/lib/harmony/resources/miniopencl" ) var LOOKS_DEAD_TIMEOUT = 10 * time.Minute // Time w/o minute heartbeats @@ -146,7 +146,7 @@ func getGpuRam() uint64 { } return uint64(lo.SumBy(platforms, func(p *cl.Platform) int64 { - d, err := p.GetDevices(cl.DeviceTypeAll) + d, err := p.GetAllDevices() if err != nil { logger.Error(err) return 0