| /** |
| * Copyright (c) 2016-present, Facebook, Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <cuda_runtime.h> |
| |
| #include <sstream> |
| #include <vector> |
| |
| #include "c10/util/Flags.h" |
| #include "caffe2/core/common_gpu.h" |
| #include "caffe2/core/init.h" |
| #include "caffe2/core/logging.h" |
| |
| using std::vector; |
| |
| C10_DECLARE_int(caffe2_log_level); |
| |
| int main(int argc, char** argv) { |
| caffe2::GlobalInit(&argc, &argv); |
| c10::SetUsageMessage( |
| "Inspects the GPUs on the current machine and prints out their details " |
| "provided by cuda."); |
| |
| int gpu_count; |
| CUDA_ENFORCE(cudaGetDeviceCount(&gpu_count)); |
| for (int i = 0; i < gpu_count; ++i) { |
| LOG(INFO) << "Querying device ID = " << i; |
| caffe2::DeviceQuery(i); |
| } |
| |
| vector<vector<bool> > access_pattern; |
| CAFFE_ENFORCE(caffe2::GetCudaPeerAccessPattern(&access_pattern)); |
| |
| std::stringstream sstream; |
| // Find topology |
| for (int i = 0; i < gpu_count; ++i) { |
| for (int j = 0; j < gpu_count; ++j) { |
| sstream << (access_pattern[i][j] ? "+" : "-") << " "; |
| } |
| sstream << std::endl; |
| } |
| LOG(INFO) << "Access pattern: " << std::endl << sstream.str(); |
| |
| return 0; |
| } |