1 //===- AMDGPUArch.cpp - list AMDGPU installed ----------*- C++ -*---------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements a tool for detecting name of AMDGPU installed in system
10 // using HSA. This tool is used by AMDGPU OpenMP driver.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #if defined(__has_include)
15 #if __has_include("hsa.h")
16 #define HSA_HEADER_FOUND 1
17 #include "hsa.h"
18 #elif __has_include("hsa/hsa.h")
19 #define HSA_HEADER_FOUND 1
20 #include "hsa/hsa.h"
21 #else
22 #define HSA_HEADER_FOUND 0
23 #endif
24 #else
25 #define HSA_HEADER_FOUND 0
26 #endif
27 
28 #if !HSA_HEADER_FOUND
29 int main() { return 1; }
30 #else
31 
32 #include <string>
33 #include <vector>
34 
35 static hsa_status_t iterateAgentsCallback(hsa_agent_t Agent, void *Data) {
36   hsa_device_type_t DeviceType;
37   hsa_status_t Status =
38       hsa_agent_get_info(Agent, HSA_AGENT_INFO_DEVICE, &DeviceType);
39 
40   // continue only if device type if GPU
41   if (Status != HSA_STATUS_SUCCESS || DeviceType != HSA_DEVICE_TYPE_GPU) {
42     return Status;
43   }
44 
45   std::vector<std::string> *GPUs =
46       static_cast<std::vector<std::string> *>(Data);
47   char GPUName[64];
48   Status = hsa_agent_get_info(Agent, HSA_AGENT_INFO_NAME, GPUName);
49   if (Status != HSA_STATUS_SUCCESS) {
50     return Status;
51   }
52   GPUs->push_back(GPUName);
53   return HSA_STATUS_SUCCESS;
54 }
55 
56 int main() {
57   hsa_status_t Status = hsa_init();
58   if (Status != HSA_STATUS_SUCCESS) {
59     return 1;
60   }
61 
62   std::vector<std::string> GPUs;
63   Status = hsa_iterate_agents(iterateAgentsCallback, &GPUs);
64   if (Status != HSA_STATUS_SUCCESS) {
65     return 1;
66   }
67 
68   for (const auto &GPU : GPUs)
69     printf("%s\n", GPU.c_str());
70 
71   if (GPUs.size() < 1)
72     return 1;
73 
74   hsa_shut_down();
75   return 0;
76 }
77 
78 #endif
79