Skip to content

Commit

Permalink
disambiguate semaphore lookup by including core type arg (#15133)
Browse files Browse the repository at this point in the history
When looking up semaphores, we now also specify which core type we are
specifically looking at.

There are multiple core types, each with there own logical core
mappings. Logical core locations can alias between core types, even
though they map to unique noc locations.
  • Loading branch information
SeanNijjar authored Dec 11, 2024
1 parent d65bc5e commit 529d6f8
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 12 deletions.
14 changes: 7 additions & 7 deletions tt_metal/impl/program/program.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ class Program_ {

std::vector<CoreRange> circular_buffers_unique_coreranges() const;

std::vector<std::reference_wrapper<const Semaphore>> semaphores_on_core(const CoreCoord &core) const;
std::vector<std::reference_wrapper<const Semaphore>> semaphores_on_core(const CoreCoord &core, CoreType core_type) const;

size_t num_semaphores () const;
void init_semaphores ( const Device & device, const CoreCoord &logical_core, uint32_t programmable_core_type_index) const;
Expand Down Expand Up @@ -830,18 +830,18 @@ void detail::Program_::validate_circular_buffer_region(const Device *device) {
}
}

size_t Program::num_semaphores(const CoreCoord &core) const { return semaphores_on_core(core).size(); }
size_t Program::num_semaphores(const CoreCoord &core, CoreType core_type) const { return semaphores_on_core(core, core_type).size(); }

size_t detail::Program_::num_semaphores() const { return semaphores_.size(); }

size_t Program::num_semaphores() const { return pimpl_->num_semaphores(); }

void detail::Program_::init_semaphores(const Device &device, const CoreCoord &logical_core, uint32_t programmable_core_type_index) const {
auto semaphores_on_core = this->semaphores_on_core(logical_core);

uint64_t kernel_config_base = hal.get_dev_addr(programmable_core_type_index, HalL1MemAddrType::KERNEL_CONFIG);
uint64_t addr = kernel_config_base + this->program_configs_[programmable_core_type_index].sem_offset;
CoreType core_type = hal.get_core_type(programmable_core_type_index);
auto semaphores_on_core = this->semaphores_on_core(logical_core, core_type);
for (auto semaphore : semaphores_on_core) {
llrt::write_hex_vec_to_core(
device.id(),
Expand Down Expand Up @@ -1772,18 +1772,18 @@ void detail::Program_::release_buffers() { owned_buffer_pool = {}; }

void Program::release_buffers() { pimpl_->release_buffers(); }

std::vector<std::reference_wrapper<const Semaphore>> detail::Program_::semaphores_on_core(const CoreCoord &core) const {
std::vector<std::reference_wrapper<const Semaphore>> detail::Program_::semaphores_on_core(const CoreCoord &core, CoreType core_type) const {
std::vector<std::reference_wrapper<const Semaphore>> semaphores;
for (const Semaphore &s : this->semaphores_) {
if (s.initialized_on_logical_core(core)) {
if (s.initialized_on_logical_core(core) && s.core_type() == core_type) {
semaphores.emplace_back(std::cref(s));
}
}
return semaphores;
}

std::vector<std::reference_wrapper<const Semaphore>> Program::semaphores_on_core(const CoreCoord &core) const {
return pimpl_->semaphores_on_core(core);
std::vector<std::reference_wrapper<const Semaphore>> Program::semaphores_on_core(const CoreCoord &core, CoreType core_type) const {
return pimpl_->semaphores_on_core(core, core_type);
}

bool detail::Program_::is_finalized() const { return this->finalized_; }
Expand Down
4 changes: 2 additions & 2 deletions tt_metal/impl/program/program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,9 @@ class Program {

std::vector<CoreRange> circular_buffers_unique_coreranges() const;

std::vector<std::reference_wrapper<const Semaphore>> semaphores_on_core(const CoreCoord &core) const;
std::vector<std::reference_wrapper<const Semaphore>> semaphores_on_core(const CoreCoord &core, CoreType core_type) const;

size_t num_semaphores ( const CoreCoord & core ) const;
size_t num_semaphores ( const CoreCoord & core, CoreType core_type ) const;
size_t num_semaphores () const;
void init_semaphores ( const Device & device, const CoreCoord &logical_core, uint32_t programmable_core_type_index) const;
// XXXXX TODO: this should return a const reference
Expand Down
6 changes: 3 additions & 3 deletions tt_metal/tt_metal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,13 +162,13 @@ void ConfigureKernelGroup(
}
}

std::optional<uint32_t> get_semaphore_id(const Program& program, const CoreRange& core_range) {
std::optional<uint32_t> get_semaphore_id(const Program &program, const CoreRange& core_range, CoreType core_type) {
std::optional<uint32_t> semaphore_id = std::nullopt;
std::vector<uint32_t> semaphore_histogram(NUM_SEMAPHORES, 0);
for (auto x = core_range.start_coord.x; x <= core_range.end_coord.x; x++) {
for (auto y = core_range.start_coord.y; y <= core_range.end_coord.y; y++) {
CoreCoord logical_core(x, y);
auto semaphores = program.semaphores_on_core(logical_core);
auto semaphores = program.semaphores_on_core(logical_core, core_type);
if (semaphores.size() == NUM_SEMAPHORES) {
TT_THROW(
"Cannot add semaphore on core {}. Max number of semaphores ({}) reached!",
Expand Down Expand Up @@ -1158,7 +1158,7 @@ uint32_t CreateSemaphore(
for (const auto& core_range : crs.ranges()) {
CoreCoord start_core = core_range.start_coord;
CoreCoord end_core = core_range.end_coord;
std::optional<uint32_t> semaphore_id_candidate = get_semaphore_id(program, core_range);
std::optional<uint32_t> semaphore_id_candidate = get_semaphore_id(program, core_range, core_type);
if (!semaphore_id.has_value()) {
semaphore_id = semaphore_id_candidate;
} else {
Expand Down

0 comments on commit 529d6f8

Please sign in to comment.