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*e038c9c4Sjoergint 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*e038c9c4Sjoergstatic 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*e038c9c4Sjoergint 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