Changes

Jump to: navigation, search

GPU621/Group 5

13,518 bytes added, 22:37, 12 April 2023
m
File Directory System:
== Investigative Report: Integrating OpenMP, TBB, and MPI into VSCode on MacOS v11.0+ ==
== Team ==
# [mailto:imuhammad-yusoof@myseneca.ca?subject=GPU621_Project Ibrahim Muhammad Yusoof]
# [mailto:hllo@myseneca.ca?subject=GPU621_Project Ho Wa Lo]
== Introduction ==
Since 2020, there has been a lot of updates to the Mac OS ecosystem, and its command line interface. Which has caused for the dependancy documentation for integrating with Mac OS outdated. So this report is our comprehensive findings for interfacing with the OpenMP, TBB, and MPI libraries on Visual Studio Code to leverage Parallel Computing Concepts that are outlined in this course. As many Software Developers working on Mac already now, Visual Studio for Mac only supports some languages, one of which '''isn’t C/C++'''. So we’ll be using the common and popular text editor, Visual Studio Code. Visual Studio Code will allow us to use the command line interface for our compiler to integrate and option the dependancies that we want to use. You should already have downloaded and installed:
* Visual Studio Code,
:* If not, you can find the Download and Install for it here: [https://code.visualstudio.com Visual Studio Code - Code Editing. Redefined]
== Integrating ==
Before we go into specifically each library, let’s talk about how VScode handles compilers. Within VSCode, when we create a .CPP file, we can either run the code in our terminal, or we can create a '''task''' that compiles our code before '''launching''' the executable with our runtime arguments. We’ll use this **task and launch** method to setup our environment for C++.
Start by creating a regular C++ workspace:
=== Tasks tasks.json ===
From here, we want to tell VScode what **tasks** to run when we press the Run and Debug button. This will be similar to how we use terminal to '''build''' our code.
This task tells VScode, when we use this task, run [this].command with [this].args. VScode will inject this into our terminal to automatically compile our code. This will help our VScode Debugger and help our launch task get ready for running our code.
g++ -fdiagnostics-color=always -g helloworld.cpp -o ./helloworld
=== Launch launch.json ===
Our launch file will facilitate the execution of our code, in the '''task.json''' we compiled and produced an output, here we will run our code with the correct information.
"configurations": []
}
<ol><li value="4"> Find and press the “'''Add configurations'''" button near the bottom right, it will let add a template configuration for us to start with </li></ol>::i. You’ll see many options come up, we want to choose “'''C/C++: (lldb) Launch'''”.Now our launch.json should look like this:
{
// Use IntelliSense to learn about possible attributes.
}
]
}
'''prelaunchTask''': The prelaunch task is set to a string that matches the label section in our tasks. It identifies which task needs to run in order for the launch to be successful. This is where you can create multiple launch tasks that setup your files differently. We’ll be adding a '''task''' and a '''launch''' for all the library we’ll be setting up.
 ===We recommend you create and test these configurations yourself, after you’ve gotten it working, you can use the same /.vscode directory in your other projects.===
== OpenMP ==
Assuming that you’ve already installed the *Intel oneAPI Base & HPC Toolkits*, let’s start with integrating OpenMP into our workspace. We’ll need to do a couple of things:
# Add a Launch
# Add the library and bin directory location for intellisense
=== Tasks tasks.json ===
We’ll add a task to compile our source code using OpenMP, this task will only build the active file using OpenMP.
At this point you’ll notice how easy it is to use VSCode for C++, we’re able to configure our build times and runtimes by often changing the same key elements.
=== Taskstasks.json ===
{
"tasks": [
}
===Launchlaunch.Jsonjson ===
{
"version": "0.2.0",
== MPI ==
MPIis a compiler, not a library so we’ll have to work with it differently, you’ll need to download MPI by using homebrew. Simply follow these steps: # Open your terminal# Update your homebrew using the following command:  brew update If you have not install homebrew in your enviroment please use the following command: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" <ol > <li value="3">Install open-mpi using the following</li></ol> brew install open-mai<ol> <li value="4"> You can see if it was successfully installed by using :</li> <li value="5"> the installation is complete, the '''mpirun''' and '''mpic++''' should return '''/usr/local/bin/**'''</li></ol>  which mpicc // for mpi c compiler which mpic++ // for mpi c++ which mpirun // Building a MPI executable  === tasks.json ===  { "tasks": [ ... { "label": "C/C++ using MPI: mpic++ build active file", // Task label we'll reference in launch "type": "cppbuild", "command": "/usr/local/bin/mpic++", // Use the mpic++ command to build our files "args": [ // Arguments to run our tasks "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ... ] } === launch.json === { "version": "0.2.0", "configurations": [ ... { "name": "C/C++ using MPI: mpic++ run active file", // Task name we'll use to identify the task "type": "cppdbg", "request": "launch", "program": "/usr/local/bin/mpirun", // MPI files uses mpirun "args": [ "-np", // Flag identifies the that we want to configure the number of processes we want to run "4", // Number of processes "${fileDirname}/${fileBasenameNoExtension}", // Path to active file ], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, // Use an external console "MIMode": "lldb", "preLaunchTask": "C/C++ using MPI: mpic++ build active file" } ... ] }
=== c_cpp_properties.json ===
 
We only need to add to the '''includePath''' array, not to the '''configurations array'''
 
{
"configurations": [
{
"name": "Mac",
"includePath": [
// Adding these wouldn't detriment any of your code
"${workspaceFolder}/**", // Adds all files within our Current workspace to the Included files
"/usr/local/Cellar/libomp/15.0.7/include", // Adds all files within the libomp workspace to the Included files
"/opt/intel/oneapi/tbb/2021.8.0/include", // Adds all files within the tbb workspace to the Included files
"/usr/local/include" // Adds the directory where the mpi Include data are
],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/g++",
"cStandard": "c11", // Standard we're using
"intelliSenseMode": "macos-clang-x64"
}
],
"version": 4
}
== Testing ==
Using these test files will help you identify if there you've successfully set up your dependancies
=== OpenMP ===
{
// OpenMP - Runtime Routines
// omp_hi.cpp // for OpenMP library functions
}
}
}
=== TBB ===
{
// TBB - Hello World
// tbb.cpp
<< TBB_INTERFACE_VERSION << ")" << std::endl; // Print a message showing the version of TBB being used
}
}
=== MPI ===
{
// MPI Program - Hello World
// mpi_hello.c
return 0;
}
== Final Note ==
Congratulations! You’ve successfully started your journey working in a parallel environment on Mac. While the fundamentals are here, it’s not the entire picture, you may run into problems that were not covered here. For example to change the optimization level, you can use these flags:
 
# -O0 (for no optimization)
# -O1 (for slight optimization)
# -O2 (for lots of optimization)
 
Google is your friend, but when you’re lost here are some great resources:
 
=== General G++ ===
[https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/ https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/]
 
=== OpenMP: ===
 
[https://gcc.gnu.org/projects/gomp/#usage https://gcc.gnu.org/projects/gomp/#usage]
 
=== TBB: ===
 
[https://oneapi-src.github.io/oneTBB/ https://oneapi-src.github.io/oneTBB/]
 
=== MPI: ===
 
[https://www.open-mpi.org/doc/current/man1/mpic++.1.php https://www.open-mpi.org/doc/current/man1/mpic++.1.php]
 
[https://www.open-mpi.org/doc/current/man1/mpirun.1.php https://www.open-mpi.org/doc/current/man1/mpirun.1.php]
=== File Directory System: ===
{
--> .vscode
| \-> launch.json
| \-> task.json
| \-> c_cpp_properties.json
--> ws1
--> ws2
--> ws3
--> ...
--> /* Your other folders of assignments and files
}
 
=== Final tasks.json: ===
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++ using OpenMP: g++ build active file", // Task label we'll reference in launch
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-Xpreprocessor", // Identifies we are setting options for preprocessing
"-fopenmp", // Preprocessor is set to use OpenMP
"-I/usr/local/Cellar/libomp/15.0.7/include", // OpenMP include directory path
"-L/usr/local/Cellar/libomp/15.0.7/lib", // OpenMP library directory path
"-lomp", // added this
"-std=c++11", // C++ language standard to follow
"-g", // Enables debugging information
"${file}", // Active file being compiled
"-o", // Output file
"${fileDirname}/${fileBasenameNoExtension}" // Output file path
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": ["$gcc"],
"group": "build",
"detail": "Task generated by User"
},
{
"type": "cppbuild",
"label": "C/C++ using TBB: g++ build active file", // Task label we'll reference in launch
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-I/opt/intel/oneapi/tbb/2021.8.0/include", // tbb include directory path
"-L/opt/intel/oneapi/tbb/2021.8.0/lib", // tbb library directory path
"-Wl,-rpath,/opt/intel/oneapi/tbb/2021.8.0/lib", // Dynamically Link the .../lib directory to the executable
"-ltbb", // Preprocessor is set to use tbb
"-std=c++11", // C++ language standard to follow
"-g", // Enables debugging information
"${file}", // Active file being compiled
"-o", // Output file
"${fileDirname}/${fileBasenameNoExtension}" // Output file path
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": ["$gcc"],
"group": "build",
"detail": "Task generated by User"
},
{
"type": "cppbuild",
"label": "C/C++ using MPI: mpic++ build active file", // Task label we'll reference in launch
"command": "/usr/local/bin/mpic++", // Use the mpic++ command to build our files
"args": [
// Arguments to run our tasks
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": ["$gcc"],
"group": "build",
"detail": "Task generated by User"
}
]
}
 
=== Final launch.json ===
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ using OpenMP: g++ build and debug active file",
"type": "cppdbg", // Create for a CPP Debugger
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}", // The program to be debugged.
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": true, // Run task in External Console
"MIMode": "lldb",
"preLaunchTask": "C/C++ using OpenMP: g++ build active file" // Make sure to set this to our task label
},
{
"name": "C/C++ using TBB: g++ build and debug active file",
"type": "cppdbg", // Create for a CPP Debugger
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}", // The program to be debugged.
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": true, // Run task in External Console
"MIMode": "lldb",
"preLaunchTask": "C/C++ using TBB: g++ build active file" // Make sure to set this to our task label
},
{
"name": "C/C++ using MPI: mpic++ run active file", // Task name we'll use to identify the task
"type": "cppdbg",
"request": "launch",
"program": "/usr/local/bin/mpirun", // MPI files uses mpirun
"args": [
"-np", // Flag identifies the that we want to configure the number of processes we want to run
"4", // Number of processes
"${fileDirname}/${fileBasenameNoExtension}" // Path to active file
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true, // Use an external console
"MIMode": "lldb",
"preLaunchTask": "C/C++ using MPI: mpic++ build active file"
}
]
}
 
=== Final c_cpp_properties.json ===
{
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/Cellar/libomp/15.0.7/include",
"/opt/intel/oneapi/tbb/2021.8.0/include",
"/usr/local/include"
],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c17",
"intelliSenseMode": "macos-clang-x64"
}
],
"version": 4
}
}
 
== References ==
[https://code.visualstudio.com/docs/cpp/launch-json-reference https://code.visualstudio.com/docs/cpp/launch-json-reference]
[https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html]
[https://medium.com/@li.nguyen_15905/setting-up-vscode-for-mpi-programming-b6665da6b4ad https://medium.com/@li.nguyen_15905/setting-up-vscode-for-mpi-programming-b6665da6b4ad]
[https://www.open-mpi.org/doc/current/man1/mpic++.1.php https://www.open-mpi.org/doc/current/man1/mpic++.1.php]
[https://www.open-mpi.org/doc/current/man1/mpirun.1.php https://www.open-mpi.org/doc/current/man1/mpirun.1.php]
 
[https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/ https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/]
 
[https://gcc.gnu.org/projects/gomp/#usage https://gcc.gnu.org/projects/gomp/#usage]
 
[https://oneapi-src.github.io/oneTBB/ https://oneapi-src.github.io/oneTBB/]
 
[https://mac.r-project.org/openmp/ https://mac.r-project.org/openmp/]
 
[https://brew.sh/ https://brew.sh/]

Navigation menu