[Bf-blender-cvs] SVN commit: bf-blender [63014] trunk/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7-gdb.py: Merge missing DPC++ libraries from 3.3 tag to trunk for Linux
Sergey Sharybin
sergey at blender.org
Thu Aug 25 12:02:25 CEST 2022
Revision: 63014
https://developer.blender.org/rBL63014
Author: sergey
Date: 2022-08-25 12:02:25 +0200 (Thu, 25 Aug 2022)
Log Message:
-----------
Merge missing DPC++ libraries from 3.3 tag to trunk for Linux
Added Paths:
-----------
trunk/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7
trunk/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7-gdb.py
Property Changed:
----------------
trunk/lib/linux_centos7_x86_64/
Index: trunk/lib/linux_centos7_x86_64
===================================================================
--- trunk/lib/linux_centos7_x86_64 2022-08-25 10:01:20 UTC (rev 63013)
+++ trunk/lib/linux_centos7_x86_64 2022-08-25 10:02:25 UTC (rev 63014)
Property changes on: trunk/lib/linux_centos7_x86_64
___________________________________________________________________
Modified: svn:mergeinfo
## -1,3 +1,3 ##
/tags/blender-2.82-release/lib/linux_centos7_x86_64:62341-62360
/tags/blender-3.0-release/lib/linux_centos7_x86_64:62740-62753
-/tags/blender-3.3-release/lib/linux_centos7_x86_64:62987-63010
\ No newline at end of property
+/tags/blender-3.3-release/lib/linux_centos7_x86_64:62987-63013
\ No newline at end of property
Copied: trunk/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7 (from rev 63013, tags/blender-3.3-release/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7)
===================================================================
(Binary files differ)
Copied: trunk/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7-gdb.py (from rev 63013, tags/blender-3.3-release/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7-gdb.py)
===================================================================
--- trunk/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7-gdb.py (rev 0)
+++ trunk/lib/linux_centos7_x86_64/dpcpp/lib/libsycl.so.5.7.0-7-gdb.py 2022-08-25 10:02:25 UTC (rev 63014)
@@ -0,0 +1,358 @@
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+import re
+import gdb
+import gdb.xmethod
+import gdb.printing
+
+### XMethod implementations ###
+
+
+class Accessor:
+ """Generalized base class for buffer index calculation"""
+
+ def memory_range(self, dim):
+ pass
+
+ def offset(self, dim):
+ pass
+
+ def data(self):
+ pass
+
+ def __init__(self, obj, result_type, depth):
+ self.obj = obj
+ self.result_type = result_type
+ self.depth = depth
+
+ def index(self, arg):
+ if arg.type.unqualified().strip_typedefs().code == gdb.TYPE_CODE_INT:
+ return int(arg)
+ # unwrap if inside item
+ try:
+ arg = arg["MImpl"]["MIndex"]
+ except:
+ pass
+ result = 0
+ for dim in range(self.depth):
+ result = (
+ result * self.memory_range(dim)
+ + self.offset(dim)
+ + arg["common_array"][dim]
+ )
+ return result
+
+ def value(self, arg):
+ return self.data().cast(self.result_type.pointer())[self.index(arg)]
+
+
+class HostAccessor(Accessor):
+ """For Host device memory layout"""
+
+ def payload(self):
+ return self.obj["impl"]["_M_ptr"].dereference()
+
+ def memory_range(self, dim):
+ return self.payload()["MMemoryRange"]["common_array"][dim]
+
+ def offset(self, dim):
+ return self.payload()["MOffset"]["common_array"][dim]
+
+ def data(self):
+ return self.payload()["MData"]
+
+
+class HostAccessorLocal(HostAccessor):
+ """For Host device memory layout"""
+
+ def index(self, arg):
+ if arg.type.code == gdb.TYPE_CODE_INT:
+ return int(arg)
+ result = 0
+ for dim in range(self.depth):
+ result = (
+ result * self.payload()["MSize"]["common_array"][dim]
+ + arg["common_array"][dim]
+ )
+ return result
+
+ def data(self):
+ return self.payload()["MMem"]
+
+
+class DeviceAccessor(Accessor):
+ """For CPU/GPU memory layout"""
+
+ def memory_range(self, dim):
+ return self.obj["impl"]["MemRange"]["common_array"][dim]
+
+ def offset(self, dim):
+ return self.obj["impl"]["Offset"]["common_array"][dim]
+
+ def data(self):
+ return self.obj["MData"]
+
+
+class AccessorOpIndex(gdb.xmethod.XMethodWorker):
+ """Generic implementation for N-dimensional ID"""
+
+ def __init__(self, class_type, result_type, depth):
+ self.class_type = class_type
+ self.result_type = result_type
+ self.depth = depth
+
+ def get_arg_types(self):
+ return gdb.lookup_type("sycl::_V1::id<%s>" % self.depth)
+
+ def get_result_type(self, *args):
+ return self.result_type
+
+ def __call__(self, obj, arg):
+ # No way to easily figure out which devices is currently being used,
+ # try all accessor implementations until one of them works:
+ accessors = [
+ DeviceAccessor(obj, self.result_type, self.depth),
+ HostAccessor(obj, self.result_type, self.depth),
+ HostAccessorLocal(obj, self.result_type, self.depth),
+ ]
+ for accessor in accessors:
+ try:
+ return accessor.value(arg)
+ except:
+ pass
+
+ print("Failed to call '%s.operator[](%s)" % (obj.type, arg.type))
+
+ return None
+
+
+class AccessorOpIndex1D(AccessorOpIndex):
+ """Introduces an extra overload for 1D case that takes plain size_t"""
+
+ def get_arg_types(self):
+ assert self.depth == 1
+ return gdb.lookup_type("size_t")
+
+
+class AccessorOpIndexItemTrue(AccessorOpIndex):
+ """Introduces an extra overload for item wrapper"""
+
+ def get_arg_types(self):
+ return gdb.lookup_type("sycl::_V1::item<%s, true>" % self.depth)
+
+
+class AccessorOpIndexItemFalse(AccessorOpIndex):
+ """Introduces an extra overload for item wrapper"""
+
+ def get_arg_types(self):
+ return gdb.lookup_type("sycl::_V1::item<%s, false>" % self.depth)
+
+
+class AccessorMatcher(gdb.xmethod.XMethodMatcher):
+ """Entry point for sycl::_V1::accessor"""
+
+ def __init__(self):
+ gdb.xmethod.XMethodMatcher.__init__(self, "AccessorMatcher")
+
+ def match(self, class_type, method_name):
+ if method_name != "operator[]":
+ return None
+
+ result = re.match("^sycl::_V1::accessor<.+>$", class_type.tag)
+ if result is None:
+ return None
+
+ depth = int(class_type.template_argument(1))
+ result_type = class_type.template_argument(0)
+
+ methods = [AccessorOpIndex(class_type, result_type, depth)]
+ try:
+ method = AccessorOpIndexItemTrue(class_type, result_type, depth)
+ method.get_arg_types()
+ methods.append(method)
+ except:
+ pass
+ try:
+ method = AccessorOpIndexItemFalse(class_type, result_type, depth)
+ method.get_arg_types()
+ methods.append(method)
+ except:
+ pass
+ if depth == 1:
+ methods.append(AccessorOpIndex1D(class_type, result_type, depth))
+ return methods
+
+
+class PrivateMemoryOpCall(gdb.xmethod.XMethodWorker):
+ """Provides operator() overload for h_item argument"""
+
+ class ItemBase:
+ """Wrapper for sycl::_V1::detail::ItemBase which reimplements index calculation"""
+
+ def __init__(
+ self,
+ obj,
+ ):
+ result = re.match("^sycl::_V1::detail::ItemBase<(.+), (.+)>$", str(obj.type))
+ self.dim = int(result[1])
+ self.with_offset = result[2] == "true"
+ self.obj = obj
+
+ def get_linear_id(self):
+ index = self.obj["MIndex"]["common_array"]
+ extent = self.obj["MExtent"]["common_array"]
+
+ if self.with_offset:
+ offset = self.obj["MOffset"]["common_array"]
+ if self.dim == 1:
+ return index[0] - offset[0]
+ elif self.dim == 2:
+ return (index[0] - offset[0]) * extent[1] + (index[1] - offset[1])
+ else:
+ return (
+ ((index[0] - offset[0]) * extent[1] * extent[2])
+ + ((index[1] - offset[1]) * extent[2])
+ + (index[2] - offset[2])
+ )
+ else:
+ if self.dim == 1:
+ return index[0]
+ elif self.dim == 2:
+ return index[0] * extent[1] + index[1]
+ else:
+ return (
+ (index[0] * extent[1] * extent[2])
+ + (index[1] * extent[2])
+ + index[2]
+ )
+
+ def __init__(self, result_type, dim):
+ self.result_type = result_type
+ self.dim = dim
+
+ def get_arg_types(self):
+ return gdb.lookup_type("sycl::_V1::h_item<%s>" % self.dim)
+
+ def get_result_type(self, *args):
+ return self.result_type
+
+ def __call__(self, obj, *args):
+ if obj["Val"].type.tag.endswith(self.result_type):
+ # On device private_memory is a simple wrapper over actual value
+ return obj["Val"]
+ else:
+ # On host it wraps a unique_ptr to an array of items
+ item_base = args[0]["localItem"]["MImpl"]
+ item_base = self.ItemBase(item_base)
+ index = item_base.get_linear_id()
+ return obj["Val"]["_M_t"]["_M_t"]["_M_head_impl"][index]
+
+
+class PrivateMemoryMatcher(gdb.xmethod.XMethodMatcher):
+ """Entry point for sycl::_V1::private_memory"""
+
+ def __init__(self):
+ gdb.xmethod.XMethodMatcher.__init__(self, "PrivateMemoryMatcher")
+
+ def match(self, class_type, method_name):
+ if method_name != "operator()":
+ return None
+
+ result = re.match(
+ "^sycl::_V1::private_memory<((cl::)?(sycl::_V1::)?id<.+>), (.+)>$", class_type.tag
+ )
+ if result is None:
+ return None
+ return PrivateMemoryOpCall(result[1], result[4])
+
+
+gdb.xmethod.register_xmethod_matcher(None, AccessorMatcher(), replace=True)
+gdb.xmethod.register_xmethod_matcher(None, PrivateMemoryMatcher(), replace=True)
+
+### Pretty-printer implementations ###
+
+
+class SyclArrayPrinter:
+ """Print an object deriving from sycl::_V1::detail::array"""
+
+ class ElementIterator:
+ def __init__(self, data, size):
+ self.data = data
+ self.size = size
+ self.count = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.count == self.size:
+ raise StopIteration
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list