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