CLRX  1
An unofficial OpenCL extensions designed for Radeon GPUs
Amd3Binaries.h
Go to the documentation of this file.
1 /*
2  * CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3  * Copyright (C) 2014-2018 Mateusz Szpakowski
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
23 #ifndef __CLRX_AMD3BINARIES_H__
24 #define __CLRX_AMD3BINARIES_H__
25 
26 #include <CLRX/Config.h>
27 #include <cstddef>
28 #include <cstdint>
29 #include <memory>
30 #include <string>
31 #include <vector>
32 #include <CLRX/amdbin/Elf.h>
34 #include <CLRX/amdbin/Commons.h>
35 #include <CLRX/utils/MemAccess.h>
36 #include <CLRX/utils/Containers.h>
37 #include <CLRX/utils/Utilities.h>
38 #include <CLRX/utils/GPUId.h>
39 #include <CLRX/utils/InputOutput.h>
41 
42 namespace CLRX
43 {
44 
45 enum : Flags {
51 };
52 
54 enum class Amd3RegionType: uint8_t
55 {
56  DATA,
57  KERNEL
58 };
59 
61 struct Amd3Region
62 {
64  size_t size;
65  size_t offset;
67 };
68 
77 
79 {
80  uint32_t groupSegmentFixedSize;
81  uint32_t privateSegmentFixedSize;
82  uint64_t reserved0;
83  uint64_t kernelCodeEntryOffset;
84  uint64_t reserved1;
85  cxbyte reserved2[12];
86  uint32_t pgmRsrc3;
87  uint32_t pgmRsrc1;
88  uint32_t pgmRsrc2;
89  uint16_t initialKernelExecState;
90  cxbyte reserved3[6];
91 
92  void toLE()
93  {
94  SLEV(groupSegmentFixedSize, groupSegmentFixedSize);
95  SLEV(privateSegmentFixedSize, privateSegmentFixedSize);
96  SLEV(kernelCodeEntryOffset, kernelCodeEntryOffset);
97  SLEV(pgmRsrc3, pgmRsrc3);
98  SLEV(pgmRsrc1, pgmRsrc1);
99  SLEV(pgmRsrc2, pgmRsrc2);
100  SLEV(initialKernelExecState, initialKernelExecState);
101  }
102 };
103 
105 {
106 public:
110 private:
111  size_t regionsNum;
112  std::unique_ptr<Amd3Region[]> regions;
113  RegionMap regionsMap;
114  size_t codeSize;
115  cxbyte* code;
116  size_t globalDataSize;
117  cxbyte* globalData;
118  CString target;
119  size_t metadataSize;
120  char* metadata;
121  const cxbyte *kernelDescData;
122  std::unique_ptr<Amd3Metadata> metadataInfo;
123  Array<size_t> kernelDescOffsets;
124  KernelDescMap kernelDescMap;
125  RegionMap kernelInfosMap;
126  Array<size_t> gotSymbols;
127 public:
129  Amd3Binary(size_t binaryCodeSize, cxbyte* binaryCode,
130  Flags creationFlags = AMD3BIN_CREATE_ALL);
132  ~Amd3Binary() = default;
133 
135  GPUDeviceType determineGPUDeviceType(uint32_t& archMinor,
136  uint32_t& archStepping) const;
138  size_t getRegionsNum() const
139  { return regionsNum; }
140 
142  const Amd3Region& getRegion(size_t index) const
143  { return regions[index]; }
144 
146  const Amd3Region& getRegion(const char* name) const;
147 
149  size_t getCodeSize() const
150  { return codeSize; }
152  const cxbyte* getCode() const
153  { return code; }
156  { return code; }
157 
159  size_t getGlobalDataSize() const
160  { return globalDataSize; }
161 
163  const cxbyte* getGlobalData() const
164  { return globalData; }
167  { return globalData; }
168 
170  size_t getMetadataSize() const
171  { return metadataSize; }
173  const char* getMetadata() const
174  { return metadata; }
176  char* getMetadata()
177  { return metadata; }
178 
180  bool hasMetadataInfo() const
181  { return metadataInfo!=nullptr; }
182 
185  { return *metadataInfo; }
186 
188  size_t getKernelInfosNum() const
189  { return metadataInfo->kernels.size(); }
190 
192  const Amd3KernelMetadata& getKernelInfo(size_t index) const
193  { return metadataInfo->kernels[index]; }
194 
196  const Amd3KernelMetadata& getKernelInfo(const char* name) const;
197 
199  size_t getKernelDescsNum() const
200  { return kernelDescOffsets.size(); }
201 
203  const Amd3KernelDescriptor& getKernelDesc(size_t index) const
204  { return *reinterpret_cast<const Amd3KernelDescriptor*>(
205  kernelDescData + kernelDescOffsets[index]); }
206 
208  const Amd3KernelMetadata& getKernelDesc(const char* name) const;
209 
211  const CString& getTarget() const
212  { return target; }
213 
215  size_t getGotSymbolsNum() const
216  { return gotSymbols.size(); }
217 
220  { return gotSymbols; }
221 
223  size_t getGotSymbol(size_t index) const
224  { return gotSymbols[index]; }
225 
227  bool hasRegionMap() const
228  { return (creationFlags & AMD3BIN_CREATE_REGIONMAP) != 0; }
230  bool hasKernelInfoMap() const
231  { return (creationFlags & AMD3BIN_CREATE_KERNELINFOMAP) != 0; }
233  bool hasKernelDescMap() const
234  { return (creationFlags & AMD3BIN_CREATE_KERNELDESCMAP) != 0; }
235 };
236 
237 };
238 
239 #endif
ROCmAccessQual
ROCm access qualifier.
Definition: ROCmBinaries.h:122
ROCmValueKind
ROCm Value kind.
Definition: ROCmBinaries.h:70
ROCm data region.
Definition: Amd3Binaries.h:61
non copyable and non movable base structure (class)
Definition: Utilities.h:46
uint32_t Flags
type for declaring various flags
Definition: Utilities.h:100
ROCm printf call info.
Definition: ROCmBinaries.h:182
const char * getMetadata() const
get metadata
Definition: Amd3Binaries.h:173
size_t getCodeSize() const
get code size
Definition: Amd3Binaries.h:149
class ElfBinaryTemplate< Elf64Types > ElfBinary64
type for 64-bit ELF binary
Definition: ElfBinaries.h:483
create region map
Definition: Amd3Binaries.h:46
common definitions for binaries
ROCm binaries handling.
bool hasMetadataInfo() const
has metadata info
Definition: Amd3Binaries.h:180
size_t getKernelInfosNum() const
get kernel metadata infos number
Definition: Amd3Binaries.h:188
const Amd3KernelDescriptor & getKernelDesc(size_t index) const
get kernel descriptor
Definition: Amd3Binaries.h:203
an array class
Definition: Containers.h:41
Configuration header.
ROCmValueType
ROCm argument&#39;s value type.
Definition: ROCmBinaries.h:91
Definition: Amd3Binaries.h:78
size_t size
data size
Definition: Amd3Binaries.h:64
Amd3RegionType
ROCm region/symbol type.
Definition: Amd3Binaries.h:54
const Amd3Region & getRegion(size_t index) const
get region by index
Definition: Amd3Binaries.h:142
size_t getGlobalDataSize() const
get global data size
Definition: Amd3Binaries.h:159
size_t getKernelDescsNum() const
get kernel descriptors number
Definition: Amd3Binaries.h:199
creation flags for ELF binaries
Definition: ElfBinaries.h:73
input output utilities
Amd3RegionType type
type
Definition: Amd3Binaries.h:66
create kernel metadata info map
Definition: Amd3Binaries.h:48
create metadata info object
Definition: Amd3Binaries.h:47
unsigned char cxbyte
unsigned byte
Definition: Config.h:229
cxbyte * getGlobalData()
get global data
Definition: Amd3Binaries.h:166
main namespace
Definition: AsmDefs.h:38
bool hasKernelDescMap() const
returns true if object has kernel descriptor map
Definition: Amd3Binaries.h:233
const CString & getTarget() const
get target
Definition: Amd3Binaries.h:211
ROCm kernel metadata.
Definition: ROCmBinaries.h:154
const cxbyte * getCode() const
get code
Definition: Amd3Binaries.h:152
ROCm binary metadata.
Definition: ROCmBinaries.h:190
Definition: Amd3Binaries.h:104
OpenCL kernel to call ??
Array< std::pair< CString, size_t > > RegionMap
region map type
Definition: Amd3Binaries.h:108
ROCm kernel argument.
Definition: ROCmBinaries.h:132
inlines for accessing memory words in LittleEndian and unaligned
bool hasKernelInfoMap() const
returns true if object has kernel info map
Definition: Amd3Binaries.h:230
size_t getRegionsNum() const
get regions number
Definition: Amd3Binaries.h:138
size_t getGotSymbol(size_t index) const
get GOT symbol index (from elfbin dynsymbols)
Definition: Amd3Binaries.h:223
GPUDeviceType
type of GPU device
Definition: GPUId.h:51
char * getMetadata()
get metadata
Definition: Amd3Binaries.h:176
utilities for other libraries and programs
CString regionName
region name
Definition: Amd3Binaries.h:63
const Array< size_t > getGotSymbols() const
get GOT symbols (indices) (from elfbin dynsymbols)
Definition: Amd3Binaries.h:219
GPU identification utilities.
create kernel metadata info map
Definition: Amd3Binaries.h:49
size_t size() const
returns number of elements
Definition: Containers.h:172
size_t offset
data
Definition: Amd3Binaries.h:65
ROCmAddressSpace
ROCm argument address space.
Definition: ROCmBinaries.h:109
kernel or global data
bool hasRegionMap() const
returns true if kernel map exists
Definition: Amd3Binaries.h:227
const Amd3KernelMetadata & getKernelInfo(size_t index) const
get kernel metadata info
Definition: Amd3Binaries.h:192
void SLEV(uint8_t &r, uint8_t v)
save from/to little endian value
Definition: MemAccess.h:246
size_t getMetadataSize() const
get metadata size
Definition: Amd3Binaries.h:170
all ROCm binaries flags
Definition: Amd3Binaries.h:50
const cxbyte * getGlobalData() const
get global data
Definition: Amd3Binaries.h:163
size_t getGotSymbolsNum() const
get GOT symbol index (from elfbin dynsymbols)
Definition: Amd3Binaries.h:215
const ROCmMetadata & getMetadataInfo() const
get metadata info
Definition: Amd3Binaries.h:184
Elf binaries handling.
simple C-string container
Definition: CString.h:38
Elf.h definitions.
containers and other utils for other libraries and programs
cxbyte * getCode()
get code
Definition: Amd3Binaries.h:155