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