-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[uArch][XeGPU] Add XeGPU uArch definition. #153706
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
b1d37c0
31e02af
84e28a9
22dbba0
82737ce
38ff707
e5a5ac6
f1535d1
3f4136a
b50f200
140a3aa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
//===--- IntelGpuXe2.h ---------------------------------------*- C++ -*-===// | ||
// | ||
// 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 | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
/// \file | ||
/// Xe2 uArch definition. | ||
adam-smnk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
/// | ||
// | ||
//===----------------------------------------------------------------------===// | ||
#ifndef MLIR_DIALECT_XEGPU_UARCH_INTEL_GPU_XE2_H | ||
adam-smnk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
#define MLIR_DIALECT_XEGPU_UARCH_INTEL_GPU_XE2_H | ||
|
||
#include "mlir/Dialect/XeGPU/uArch/uArchInterfaces.h" | ||
#include "mlir/IR/BuiltinTypes.h" | ||
#include "mlir/IR/TypeUtilities.h" | ||
#include <map> | ||
#include <string> | ||
#include <vector> | ||
|
||
namespace mlir { | ||
namespace xegpu { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: maybe it should live under Otherwise, adding this info into There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I understand the issue. |
||
namespace uArch { | ||
namespace Xe2Plus { | ||
struct XeCoreInfo { | ||
|
||
uint32_t num_threads; | ||
SharedMemory shared_memory; | ||
uint32_t num_vector_units; | ||
uint32_t num_matrix_units; | ||
|
||
// Constructor | ||
XeCoreInfo(uint32_t num_threads, const SharedMemory &shared_memory, | ||
uint32_t num_vector_units, uint32_t num_matrix_units) | ||
: num_threads(num_threads), shared_memory(shared_memory), | ||
num_vector_units(num_vector_units), num_matrix_units(num_matrix_units) { | ||
} | ||
}; | ||
|
||
struct Xe2Plus : public uArch { | ||
rolfmorel marked this conversation as resolved.
Show resolved
Hide resolved
|
||
XeCoreInfo xe_core; | ||
Xe2Plus( | ||
const std::string &archName, const std::string &archDescription, | ||
const XeCoreInfo &xeCore, | ||
const std::vector<uArchHierarchyComponent> &hierarchy = {}, | ||
const std::map<std::string, RegisterFileInfo> ®Info = {}, | ||
const std::vector<CacheInfo> &cacheInfo = {}, | ||
const std::map<std::string, std::shared_ptr<Instruction>> &instrs = {}) | ||
: uArch(archName, archDescription, hierarchy, regInfo, cacheInfo, instrs), | ||
xe_core(xeCore) {} | ||
}; | ||
|
||
// struct to represent DPAS instruction | ||
struct DPASInstruction : public Instruction, public MMAInstructionInterface { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: It would helpful to somewhere document to which abstraction level this info corresponds to. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The instruction itself actually contains the scope. |
||
DPASInstruction() | ||
: Instruction("dpas", // name | ||
"Dot Product Accumulate") // description | ||
{} | ||
|
||
// Override all virtuals from MatrixOpInterface | ||
virtual std::vector<std::pair<uint32_t, uint32_t>> | ||
getSupportedShapes(mlir::Type dataType, MMAOpndEnum matrixType) override; | ||
virtual std::vector<mlir::Type> | ||
getSupportedTypes(MLIRContext &context, MMAOpndEnum matrixType) override; | ||
virtual bool | ||
checkSupportedShapesAndTypes(std::pair<uint32_t, uint32_t> AShape, | ||
std::pair<uint32_t, uint32_t> BShape, | ||
std::pair<uint32_t, uint32_t> CShape, | ||
std::pair<uint32_t, uint32_t> DShape, | ||
mlir::Type AType, mlir::Type BType, | ||
mlir::Type CType, mlir::Type DType) override; | ||
virtual bool checkSupportedTypes(mlir::Type AType, mlir::Type BType, | ||
mlir::Type CType, mlir::Type DType) override; | ||
virtual bool validate(std::pair<uint32_t, uint32_t> AShape, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What's the difference between this and There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For this specific case, none. We wanted to keep the 5 interfaces consistent across all the Instruction Interfaces. That's why it exists here. |
||
std::pair<uint32_t, uint32_t> BShape, | ||
std::pair<uint32_t, uint32_t> CShape, | ||
std::pair<uint32_t, uint32_t> DShape, mlir::Type AType, | ||
mlir::Type BType, mlir::Type CType, | ||
mlir::Type DType) override; | ||
virtual std::vector<uint32_t> getSupportedM(mlir::Type type) override; | ||
virtual std::vector<uint32_t> getSupportedK(mlir::Type type) override; | ||
virtual std::vector<uint32_t> getSupportedN(mlir::Type type) override; | ||
}; | ||
|
||
namespace PVCuArch { | ||
|
||
struct PVCuArch : public Xe2Plus { | ||
adam-smnk marked this conversation as resolved.
Show resolved
Hide resolved
|
||
// Maintaines ownership of the instructions owned by PVUarch | ||
std::vector<std::shared_ptr<Instruction>> owned_instructions; | ||
PVCuArch() | ||
: Xe2Plus("pvc", // archName | ||
"Ponte Vecchio Architecture", // archDescription | ||
XeCoreInfo(8, SharedMemory(512 * 1024, 4), 8, 8), // xeCore | ||
{/* register_file_info */}, // Optional: empty | ||
{/* cache_info */}, // Optional: empty | ||
{/* instructions */} // Optional: empty | ||
) { | ||
// Initialize uArchHierarchy | ||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("thread", 0)); | ||
rolfmorel marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("XeCore", 8)); | ||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("XeSlice", 16)); | ||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("XeStack", 4)); | ||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("gpu", 2)); | ||
// Intialize register file info | ||
// GRF | ||
this->register_file_info.emplace( | ||
"GRF", | ||
RegisterFileInfo(64 * 1024, // size in bits | ||
{"small", "large"}, // GRF modes | ||
{128, 256}, // registers per thread per mode | ||
0, // number of banks | ||
0 // bank size | ||
)); | ||
// Initialize cache info | ||
// L1 cache, XeCore level | ||
this->cache_info.push_back( | ||
CacheInfo(512 * 1024, 64, this->uArch_hierarchy[1])); | ||
// L3 cache, XeStack level | ||
|
||
this->cache_info.push_back( | ||
CacheInfo(512 * 1024, 64, this->uArch_hierarchy[3])); | ||
|
||
// Add the instructions | ||
auto dpas = std::make_shared<DPASInstruction>(); | ||
instructions.emplace(dpas->getName(), dpas); | ||
// instructions[dpas->name] = dpas.get(); | ||
|
||
owned_instructions.push_back(dpas); | ||
} | ||
}; | ||
} // namespace PVCuArch | ||
|
||
namespace BMGuArch { | ||
struct BMGuArch : public Xe2Plus { | ||
// Maintaines ownership of the instructions owned by PVUarch | ||
std::vector<std::shared_ptr<Instruction>> owned_instructions; | ||
BMGuArch() | ||
: Xe2Plus("bmg", // archName | ||
"Battlemage Architecture", // archDescription | ||
XeCoreInfo(8, SharedMemory(256 * 1024, 4), 8, 8), // xeCore | ||
{/* register_file_info */}, // Optional: empty | ||
{/* cache_info */}, // Optional: empty | ||
{/* instructions */}, // Optional: empty | ||
{/* restrictions */} // Optional: empty | ||
) { | ||
// Initialize uArchHierarchy | ||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("thread", 0)); | ||
|
||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("XeCore", 8)); | ||
|
||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("XeSlice", 4)); | ||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("XeStack", 5)); | ||
this->uArch_hierarchy.push_back(uArchHierarchyComponent("gpu", 1)); | ||
// Intialize register file info | ||
// GRF | ||
this->register_file_info["GRF"] = | ||
RegisterFileInfo(64 * 1024, // size in bits | ||
{"small", "large"}, // GRF modes | ||
{128, 256}, // registers per thread per mode | ||
0, // number of banks | ||
0 // bank size | ||
); | ||
// Initialize cache info | ||
// L1 cache, XeCore level | ||
this->cache_info.push_back( | ||
CacheInfo(256 * 1024, 64, this->uArch_hierarchy[1])); | ||
// L3 cache, XeStack level | ||
this->cache_info.push_back( | ||
CacheInfo(18 * 1024 * 1024, 256, this->uArch_hierarchy[3])); | ||
|
||
// Add the instructions | ||
auto dpas = std::make_shared<DPASInstruction>(); | ||
instructions.emplace(dpas->getName(), dpas); | ||
// instructions[dpas->name] = dpas.get(); | ||
owned_instructions.push_back(dpas); | ||
} | ||
}; | ||
} // namespace BMGuArch | ||
|
||
} // namespace Xe2Plus | ||
} // namespace uArch | ||
} // namespace xegpu | ||
} // namespace mlir | ||
|
||
#endif // MLIR_DIALECT_XEGPU_UARCH_INTEL_GPU_XE2_H |
Uh oh!
There was an error while loading. Please reload this page.