159ad4e0fSPushpinder Singh //===- AMDGPUArch.cpp - list AMDGPU installed ----------*- C++ -*---------===//
259ad4e0fSPushpinder Singh //
359ad4e0fSPushpinder Singh // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
459ad4e0fSPushpinder Singh // See https://llvm.org/LICENSE.txt for license information.
559ad4e0fSPushpinder Singh // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
659ad4e0fSPushpinder Singh //
759ad4e0fSPushpinder Singh //===----------------------------------------------------------------------===//
859ad4e0fSPushpinder Singh //
959ad4e0fSPushpinder Singh // This file implements a tool for detecting name of AMDGPU installed in system
1059ad4e0fSPushpinder Singh // using HSA. This tool is used by AMDGPU OpenMP driver.
1159ad4e0fSPushpinder Singh //
1259ad4e0fSPushpinder Singh //===----------------------------------------------------------------------===//
1359ad4e0fSPushpinder Singh 
14*c711aa0fSPushpinder Singh #if defined(__has_include)
15*c711aa0fSPushpinder Singh #if __has_include("hsa.h")
16*c711aa0fSPushpinder Singh #define HSA_HEADER_FOUND 1
17*c711aa0fSPushpinder Singh #include "hsa.h"
18*c711aa0fSPushpinder Singh #elif __has_include("hsa/hsa.h")
19*c711aa0fSPushpinder Singh #define HSA_HEADER_FOUND 1
20*c711aa0fSPushpinder Singh #include "hsa/hsa.h"
21*c711aa0fSPushpinder Singh #else
22*c711aa0fSPushpinder Singh #define HSA_HEADER_FOUND 0
23*c711aa0fSPushpinder Singh #endif
24*c711aa0fSPushpinder Singh #else
25*c711aa0fSPushpinder Singh #define HSA_HEADER_FOUND 0
26*c711aa0fSPushpinder Singh #endif
27*c711aa0fSPushpinder Singh 
28*c711aa0fSPushpinder Singh #if !HSA_HEADER_FOUND
main()29*c711aa0fSPushpinder Singh int main() { return 1; }
30*c711aa0fSPushpinder Singh #else
31*c711aa0fSPushpinder Singh 
3259ad4e0fSPushpinder Singh #include <string>
3359ad4e0fSPushpinder Singh #include <vector>
3459ad4e0fSPushpinder Singh 
iterateAgentsCallback(hsa_agent_t Agent,void * Data)3559ad4e0fSPushpinder Singh static hsa_status_t iterateAgentsCallback(hsa_agent_t Agent, void *Data) {
3659ad4e0fSPushpinder Singh   hsa_device_type_t DeviceType;
3759ad4e0fSPushpinder Singh   hsa_status_t Status =
3859ad4e0fSPushpinder Singh       hsa_agent_get_info(Agent, HSA_AGENT_INFO_DEVICE, &DeviceType);
3959ad4e0fSPushpinder Singh 
4059ad4e0fSPushpinder Singh   // continue only if device type if GPU
4159ad4e0fSPushpinder Singh   if (Status != HSA_STATUS_SUCCESS || DeviceType != HSA_DEVICE_TYPE_GPU) {
4259ad4e0fSPushpinder Singh     return Status;
4359ad4e0fSPushpinder Singh   }
4459ad4e0fSPushpinder Singh 
4559ad4e0fSPushpinder Singh   std::vector<std::string> *GPUs =
4659ad4e0fSPushpinder Singh       static_cast<std::vector<std::string> *>(Data);
4759ad4e0fSPushpinder Singh   char GPUName[64];
4859ad4e0fSPushpinder Singh   Status = hsa_agent_get_info(Agent, HSA_AGENT_INFO_NAME, GPUName);
4959ad4e0fSPushpinder Singh   if (Status != HSA_STATUS_SUCCESS) {
5059ad4e0fSPushpinder Singh     return Status;
5159ad4e0fSPushpinder Singh   }
5259ad4e0fSPushpinder Singh   GPUs->push_back(GPUName);
5359ad4e0fSPushpinder Singh   return HSA_STATUS_SUCCESS;
5459ad4e0fSPushpinder Singh }
5559ad4e0fSPushpinder Singh 
main()5659ad4e0fSPushpinder Singh int main() {
5759ad4e0fSPushpinder Singh   hsa_status_t Status = hsa_init();
5859ad4e0fSPushpinder Singh   if (Status != HSA_STATUS_SUCCESS) {
5959ad4e0fSPushpinder Singh     return 1;
6059ad4e0fSPushpinder Singh   }
6159ad4e0fSPushpinder Singh 
6259ad4e0fSPushpinder Singh   std::vector<std::string> GPUs;
6359ad4e0fSPushpinder Singh   Status = hsa_iterate_agents(iterateAgentsCallback, &GPUs);
6459ad4e0fSPushpinder Singh   if (Status != HSA_STATUS_SUCCESS) {
6559ad4e0fSPushpinder Singh     return 1;
6659ad4e0fSPushpinder Singh   }
6759ad4e0fSPushpinder Singh 
6859ad4e0fSPushpinder Singh   for (const auto &GPU : GPUs)
6959ad4e0fSPushpinder Singh     printf("%s\n", GPU.c_str());
7059ad4e0fSPushpinder Singh 
7159ad4e0fSPushpinder Singh   if (GPUs.size() < 1)
7259ad4e0fSPushpinder Singh     return 1;
7359ad4e0fSPushpinder Singh 
7459ad4e0fSPushpinder Singh   hsa_shut_down();
7559ad4e0fSPushpinder Singh   return 0;
7659ad4e0fSPushpinder Singh }
77*c711aa0fSPushpinder Singh 
78*c711aa0fSPushpinder Singh #endif
79