<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Building and Running C/C&#43;&#43;/Fortran Codes on HPC Systems | RC Learning Portal</title>
    <link>/notes/building-running-c-cpp-fortran/</link>
      <atom:link href="/notes/building-running-c-cpp-fortran/index.xml" rel="self" type="application/rss+xml" />
    <description>Building and Running C/C&#43;&#43;/Fortran Codes on HPC Systems</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>en-us</language><copyright>©&nbsp;2026 The Rector and Visitors of the University of Virginia</copyright><lastBuildDate>Tue, 14 Apr 2026 16:42:59 +0000</lastBuildDate>
    <image>
      <url>/images/icon_hu13341279237897646923.png</url>
      <title>Building and Running C/C&#43;&#43;/Fortran Codes on HPC Systems</title>
      <link>/notes/building-running-c-cpp-fortran/</link>
    </image>
    
    <item>
      <title>Building an Executable</title>
      <link>/notes/building-running-c-cpp-fortran/compilers/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/compilers/</guid>
      <description>&lt;p&gt;Users who write their own programs in C, C++, or Fortran, or who use community codes written in these languages, must always convert their source code into a runnable executable before they can use the software.  The process of creating an executable is called &lt;em&gt;building&lt;/em&gt;, and consists of &lt;em&gt;compiling&lt;/em&gt;, or converting source into machine-language files, and &lt;em&gt;linking&lt;/em&gt;, which links these files along with any external libraries into an executable.&lt;/p&gt;
&lt;h2 id=&#34;compilers&#34;&gt;Compilers&lt;/h2&gt;
&lt;p&gt;A &lt;em&gt;compiler&lt;/em&gt; is a program that converts human-written &lt;em&gt;source code&lt;/em&gt; directly into a standalone program called an &lt;em&gt;executable&lt;/em&gt; (or binary).  This is in contrast to an &lt;em&gt;interpreter&lt;/em&gt;, which is a program that executes source code, often called a &lt;em&gt;script&lt;/em&gt; in this case, line by line.&lt;/p&gt;
&lt;p&gt;Compilers go through a multi-stage process to convert source code to an executable.&lt;/p&gt;
&lt;p&gt;When running an interpreter, the executable is the interpreter itself. Your script cannot be run directly.  Some scripts can invoke their own interpreters and run standalone, but they are not themselves binaries.&lt;/p&gt;
&lt;h2 id=&#34;linkers&#34;&gt;Linkers&lt;/h2&gt;
&lt;p&gt;The compiler first produces an &lt;em&gt;object file&lt;/em&gt; for each &lt;em&gt;source file&lt;/em&gt;. In Unix these end in .o&lt;/p&gt;
&lt;p&gt;Object files are binary (machine language) but cannot be executed. They must be &lt;em&gt;linked&lt;/em&gt; into an executable.&lt;/p&gt;
&lt;p&gt;Libraries are special archives of compiled code that can be invoked through their application programming interface, or &lt;em&gt;API&lt;/em&gt;.  Like the object files, they must be linked into an executable in order to be utilized.&lt;/p&gt;
&lt;p&gt;The program that generates the executable from object files and any external libraries is the &lt;em&gt;linker&lt;/em&gt; (also called a loader). Linkders are nearly always invoked through the compiler, not separately. The linker joins all object files as specified, and if run through the appropriate compiler it also links the compiler&amp;rsquo;s &lt;em&gt;runtime libraries&lt;/em&gt; for the source language. These are libraries used to carry out procedures intrinsic to the language. This happens automatically if the compiler matches the language of the main program; it is not necessary to add the runtime libraries explicitly.  However, in mixed-language programming it may be necessary to add them to the linking instructions.&lt;/p&gt;
&lt;h2 id=&#34;building&#34;&gt;Building&lt;/h2&gt;
&lt;p&gt;The process of compiling and linking is usually called &lt;em&gt;buildint&lt;/em&gt; the executable.  The result is a file in machine language which cannot be read by (most) humans.  Binaries/executables are specific to a platform, a combination of machine architecture and operating system. You cannot run a Windows binary on a Linux system, and vice versa.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Compiler Suites</title>
      <link>/notes/building-running-c-cpp-fortran/compiler_suites/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/compiler_suites/</guid>
      <description>&lt;p&gt;Compilers are usually run through either an Integrated Development Environment, such as VSCOde, or through the command line in a shell. They are usually shipped by their vendor in &lt;em&gt;suites&lt;/em&gt; which consist of multiple programming languages sharing a common backend.&lt;/p&gt;
&lt;h2 id=&#34;lmod&#34;&gt;Lmod&lt;/h2&gt;
&lt;p&gt;Many HPC sites, including UVA&amp;rsquo;s, provide multiple compiler suites and compiler versions, which we manage through &lt;code&gt;lmod&lt;/code&gt; &lt;em&gt;modules&lt;/em&gt;.  These should not be confused with modules in programming languages such as Fortran or Python; in this context the module is a script that sets up the environment for a specified software package.&lt;/p&gt;
&lt;p&gt;For compilers, loading a module sets some necessary variables so that the correct compiler(s), linkers, and runtime libraries are in scope in the user&amp;rsquo;s environment.&lt;/p&gt;
&lt;p&gt;Modules are loaded with the &lt;code&gt;load&lt;/code&gt; command.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;module load gcc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sets up the default version of the GCC suite.&lt;/p&gt;
&lt;p&gt;Modules set important environment variables such as &lt;code&gt;LOAD_LIBRARY_PATH&lt;/code&gt; variable. Modules will set this variable appropriately, but since it must have the correct value, the modules used to build must also be loaded for running.&lt;/p&gt;
&lt;h2 id=&#34;gnu-compiler-collection-gcc&#34;&gt;Gnu Compiler Collection (gcc)&lt;/h2&gt;
&lt;p&gt;The GNU Compiler Collection includes front ends for C, C++, and Fortran, as well as libraries for these languages (libc, libstdc++, libgfortran).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gcc is the C compiler&lt;/li&gt;
&lt;li&gt;g++ is the C++ compiler&lt;/li&gt;
&lt;li&gt;gfortran is the Fortran compiler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To see a list of available versions, type&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;module spider gcc 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will result in output similar to (versions will vary over time):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-no-highlight&#34;&gt;---------------------------------------------------------------------------
  gcc:
----------------------------------------------------------------------------
    Description:
      The GNU Compiler Collection includes front ends for C, C++,
      Objective-C, Fortran, Java, and Ada, as well as libraries for these
      languages (libstdc++, libgcj,...).

     Versions:
        gcc/system
        gcc/7.1.0
        gcc/9.2.0
     Other possible modules matches:
        gcccuda

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;intel&#34;&gt;Intel&lt;/h2&gt;
&lt;p&gt;Intel compilers frequently produce the fastest binaries for Intel architectures and are usually recommended for users who want the best performance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;icx is the C compiler&lt;/li&gt;
&lt;li&gt;icpx is the C++ compiler&lt;/li&gt;
&lt;li&gt;ifx is the Fortran compiler&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;module spider intel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NVIDIA HPC SDK&lt;/p&gt;
&lt;p&gt;We also offer the NVIDIA HPC SDK (software development kit) compilers.  This suite is particularly strong at programming for general-purpose GPUs, mainly of NVIDIA architecture. They provide tools such as OpenACC and OpenMP for programming for GPGPUs, but also support interfaces to CUDA through the higher-level languages, in particular C++ and Fortran.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nvcc&lt;/li&gt;
&lt;li&gt;nvc++&lt;/li&gt;
&lt;li&gt;nvfortran&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;module spider nvhpc
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Compiling a Single-File Program</title>
      <link>/notes/building-running-c-cpp-fortran/build_single_file/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/build_single_file/</guid>
      <description>&lt;p&gt;Suppose your program is short and can be contained within a single file.
If not told otherwise a compiler will attempt to compile and link the source file(s) it is instructed to compile in one step.  With only one file, no separate invocation of the linker is required.&lt;/p&gt;
&lt;p&gt;The default name for the executable is &lt;code&gt;a.out&lt;/code&gt;.
The option &lt;code&gt;-o&lt;/code&gt; is used to name the binary something else.&lt;/p&gt;
&lt;p&gt;Examples for each compiler:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Build a C program&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gcc -o myprog mycode.c&lt;/li&gt;
&lt;li&gt;icx -o myprog mycode.c&lt;/li&gt;
&lt;li&gt;nvcc -o myprog mycode.c&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build a C++ program&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;g++ -o myprog mycode.cxx&lt;/li&gt;
&lt;li&gt;icpx &amp;ndash;o myprog mycode.cxx&lt;/li&gt;
&lt;li&gt;nvc++ -o myprog mycode.cxx&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build a Fortran program&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gfortran &amp;ndash;o myprog mycode.f90&lt;/li&gt;
&lt;li&gt;ifx &amp;ndash;o myprog mycode.f90&lt;/li&gt;
&lt;li&gt;nvfortran &amp;ndash;o myprog mycode.f90&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Exercise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Load a compiler module (your choice).  Copy one of the following
files from /share/resources/tutorials/compilers to your home directory, or to
a directory you create for the examples.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mycode.c&lt;/li&gt;
&lt;li&gt;mycode.cxx&lt;/li&gt;
&lt;li&gt;mycode.f90&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use the appropriate compiler to build your executable. Choose any name you wish for the executable.&lt;/p&gt;
&lt;h2 id=&#34;file-permissions&#34;&gt;File Permissions&lt;/h2&gt;
&lt;p&gt;On a Unix system, an executable must have the right permission. Unless something goes very wrong, the compiler/linker will set the &amp;ldquo;execute bit&amp;rdquo; for your executable; you should not need to do that yourself.&lt;/p&gt;
&lt;p&gt;In your directory that contains at least one executable run&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;ls -l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make sure you are in the same directory as the executable you want to run. Type&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;./myprog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use the name you assigned your executable. &lt;code&gt;./&lt;/code&gt; means current directory and is necessary because that is not in your default path.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Compiling and Linking Multiple Files</title>
      <link>/notes/building-running-c-cpp-fortran/build_multiple_files/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/build_multiple_files/</guid>
      <description>&lt;p&gt;Most programs consist of multiple files.  For Unix compilers the &lt;code&gt;-c&lt;/code&gt; option suppresses linking. The compiler must then be run again to build the executable from the object files.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;g++ -c mymain.cxx
g++ -c mysub1.cxx
g++ -c mysub2.cxx 
g++ -o myprog mymain.o mysub1.o mysub2.o 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These compiler flags are similar for all three compiler suites.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;ifx -c mymain.f90 
ifx -c mysub1.f90 
ifx -c mysub2.f90
ifx -o myprog mymain.o mysub1.o mysub2.o
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;linkers-and-libraries&#34;&gt;Linkers and Libraries&lt;/h2&gt;
&lt;p&gt;When the executable is created any external libraries must also be linked.
The compiler will search a standard path for libraries. On Unix this is typically /usr/lib, /usr/lib64, /usr/local/lib, /lib&lt;/p&gt;
&lt;p&gt;There are two kinds of library, &lt;em&gt;static&lt;/em&gt; and &lt;em&gt;dynamic&lt;/em&gt;. If the library name ends
in &lt;code&gt;.a&lt;/code&gt; it is a static library; in this case, the machine code is bundled into
the executable at compile time. If the name ends in &lt;code&gt;.so&lt;/code&gt; it is a shared
library; the machine code is loaded at runtime.  For shared libraries, the
compiler must know the path to the library at compile time, and the executable
must be able to find the library at runtime. For Unix/Linux systems, shared librries are the default.&lt;/p&gt;
&lt;p&gt;If you must use paths other than the defaults, you must specify those paths to the compiler.
&lt;code&gt;-L&lt;/code&gt; followed by a path is the option for Unix compilers; then the library must be named &lt;code&gt;libfoo.a&lt;/code&gt; or &lt;code&gt;libfoo.so&lt;/code&gt;.  Another option provides the shortened name of the library; it is referenced as &lt;code&gt;-lfoo&lt;/code&gt; in either case.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;g++ -o mycode -L/usr/lib64/foolib mymain.o mysub1.o mysub2.o -lfoo 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As a general rule, libraries must be compiled by the same compiler that you use for your program.  However, Intel and NVHPC compilers can usually link C (not necessarily C++) system libraries.&lt;/p&gt;
&lt;p&gt;For most Unix compilers, &lt;em&gt;order matters&lt;/em&gt;! The object file containing the code being called must be linked after the object file that uses it.  Libraries come last, and must also be in the correct order.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Library and Header Paths on HPC</title>
      <link>/notes/building-running-c-cpp-fortran/header_paths/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/header_paths/</guid>
      <description>&lt;p&gt;Many codes need headers (C/C++) or modules (Fortran) for procedure prototypes, etc.  This is especially common if it is using an external library.
As was true for libraries, there is a system default search path for these &amp;ldquo;include files.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The compiler flag is &lt;code&gt;-I/path/to/includes&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The path to Fortran module files is also specified by the &lt;code&gt;-I&lt;/code&gt; flag.&lt;/p&gt;
&lt;p&gt;The lmod modules system we use is hierarchical. You must first load your choice of compiler. From there you can type&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;module avail
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The modules at the top will be for libraries built with that compiler.
You will generally need to provide paths for these libraries by &lt;code&gt;-L&lt;/code&gt; and &lt;code&gt;-I&lt;/code&gt;
flags. You can find the paths with&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;printenv | grep ROOT 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Most recent modules have an environment variable &lt;code&gt;NAME_ROOT&lt;/code&gt;, e.g.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-no-highlight&#34;&gt;HDF5_ROOT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A number of scientific and engineering codes need the input/output libraries
HDF5 or NetCDF. We will use NetCDF for this example.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;module load gcc
module load netcdf

printenv | grep ROOT 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following should be typed on a single line:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;gfortran -o myexec -L${NETCDF_ROOT}/lib -I${NETCDF_ROOT}/include mycode.f90 -lnetcdff -lnetcdf 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Exercises&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Exercise 1. Multiple files (no C example here)&lt;/p&gt;
&lt;p&gt;Copy from &lt;code&gt;/share/resources/tutorials/compilers&lt;/code&gt; your choice of files&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy &lt;code&gt;main.cxx&lt;/code&gt; or &lt;code&gt;main.f90&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;sub1.cxx&lt;/code&gt; or &lt;code&gt;sub1.f90&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;sub2.cxx&lt;/code&gt; or &lt;code&gt;sub2.f90&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;C++ copy &lt;code&gt;sub1.h&lt;/code&gt; and &lt;code&gt;sub2.h&lt;/code&gt; as well&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use these three files to create an executable.&lt;/p&gt;
&lt;p&gt;Exercise 2. External Libraries&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Load the netcdf module for your choice of compiler suite as indicated above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy &lt;code&gt;simple_xy_wr.c&lt;/code&gt; or &lt;code&gt;simple_xy_wr.cpp&lt;/code&gt; or &lt;code&gt;simple_xy_wr.f90&lt;/code&gt; (note the C++ suffix is &lt;code&gt;cpp&lt;/code&gt; here).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compile and link the examples. You will need to add
&lt;code&gt;-I${NETCDF_ROOT}/include&lt;/code&gt; and &lt;code&gt;-L${NETCDF_ROOT}/lib&lt;/code&gt; to your link command. For C use &lt;code&gt;-lnetcdf&lt;/code&gt; for the library. For Fortran use &lt;code&gt;-lnetcdff -lnetcdf&lt;/code&gt; in that order. For C++ use &lt;code&gt;-lnetcdf_c++ -lnetcdf&lt;/code&gt; in that order.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Build Tools: Make</title>
      <link>/notes/building-running-c-cpp-fortran/make/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/make/</guid>
      <description>&lt;p&gt;Building a program with more than one or two files can become very difficult to manage.  Various build tools have been developed.&lt;/p&gt;
&lt;h2 id=&#34;make&#34;&gt;Make&lt;/h2&gt;
&lt;p&gt;The oldest and still most common is &lt;code&gt;make&lt;/code&gt;. Even many newer tools like &lt;code&gt;cmake&lt;/code&gt; generate a &lt;code&gt;makefile&lt;/code&gt;, at least on Unix.&lt;/p&gt;
&lt;p&gt;Make is a tool to manage builds. It has a rigid and peculiar syntax.  It will look for a file named &lt;code&gt;makefile&lt;/code&gt; first, followed by &lt;code&gt;Makefile&lt;/code&gt; (on case-sensitive systems).  The makefile defines one or more &lt;em&gt;targets&lt;/em&gt;. The target is the product of one or more &lt;em&gt;rules&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The target is defined with a colon following its name. If there are &lt;em&gt;dependencies&lt;/em&gt; those follow the colon.  Dependencies are other files that are required to create the current target.&lt;/p&gt;
&lt;h3 id=&#34;targets-and-rules&#34;&gt;Targets and Rules&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-no-highlight&#34;&gt;myexec: main.o module.o 
&amp;lt;tab&amp;gt;gfortran -o myexec main.o module.o
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The tab is &lt;em&gt;required&lt;/em&gt; in the rule. Don&amp;rsquo;t ask why. The angle brackets are to indicate the character and are not typed.&lt;/p&gt;
&lt;p&gt;Macros (automatic targets) for rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$@&lt;/code&gt; represents the file name of the current target&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&amp;lt;&lt;/code&gt; represents the name of the first prerequisite&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;variables-comments-and-continuations&#34;&gt;Variables, Comments, and Continuations&lt;/h3&gt;
&lt;p&gt;We can define variables in makefiles&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-no-highlight&#34;&gt;F90=gfortran
CC=gcc
CXX=icpc 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We then refer to them as &lt;code&gt;$(F90)&lt;/code&gt;, &lt;code&gt;$(CC)&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;Common variables: F90, CC, CXX, FFLAGS, F90FLAGS, CFLAGS, CXXFLAGS, CPPFLAGS (for the preprocessor), LDFLAGS.&lt;/p&gt;
&lt;p&gt;Comments may be inserted into a Makefile.  Anything from a &lt;code&gt;#&lt;/code&gt; onward is ignored, unless it is a backslash &lt;code&gt;\&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The backslash is the line-continuation marker.  Be sure it is the &lt;em&gt;last&lt;/em&gt; character on the line.  If it appears as the last character in a comment line, it allows the comment to be extended over multiple lines.&lt;/p&gt;
&lt;h3 id=&#34;suffix-rules&#34;&gt;Suffix Rules&lt;/h3&gt;
&lt;p&gt;If all files with a given suffix (.c, .cxx, .f90, etc.) are to be compiled the same way, we can write a &lt;em&gt;suffix rule&lt;/em&gt; to handle them.
This uses a &lt;em&gt;phony target&lt;/em&gt; called .SUFFIXES.
The rule must begin with a tab as usual.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.SUFFIXES: .f90 .o
&amp;lt;tab&amp;gt;$(F90) $(F90FLAGS) -c $&amp;lt; 

.SUFFIXES: .cxx .cpp .o 
&amp;lt;tab&amp;gt;$(CXX) -c $(CXXFLAGS) -c &amp;lt;$
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Pattern Rules in Make</title>
      <link>/notes/building-running-c-cpp-fortran/make_rules/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/make_rules/</guid>
      <description>&lt;p&gt;This is an extension by Gnu make (gmake), but nearly every make, especially on Linux, is gmake now.  They are similar to suffix rules.&lt;/p&gt;
&lt;p&gt;Gmake contains built-in pattern rules so it can handle common cases if you do not write your own rules.  For example, to compile a C code it will by default use&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-no-highlight&#34;&gt;%.o : %.c
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $&amp;lt; -o $@
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A pattern rule that is particularly useful for Fortran 90+:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-no-highlight&#34;&gt;%.mod: %.o 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This can be helpful because make&amp;rsquo;s default pattern rule for &lt;code&gt;.mod&lt;/code&gt; is for a programming language called Modula, but Fortran uses &lt;code&gt;.mod&lt;/code&gt; for compiled module interface files.  Adding this pattern rule overrides the built-in rule for that suffix.&lt;/p&gt;
&lt;h2 id=&#34;make-options&#34;&gt;Make Options&lt;/h2&gt;
&lt;p&gt;Files with names other than &lt;code&gt;makefile&lt;/code&gt; or &lt;code&gt;Makefile&lt;/code&gt; can be used with the -f option&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-no-highlight&#34;&gt;make -f Make.linux 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make creates the first target in the file unless a specific target is specified.(Some Makefiles are written to require a target.). To generate a different target, provide its name on the command line.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-no-highlight&#34;&gt;make pw.x 
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>makemake</title>
      <link>/notes/building-running-c-cpp-fortran/makemake/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/makemake/</guid>
      <description>&lt;p&gt;The &lt;code&gt;makemake&lt;/code&gt; command is a script that will create a skeleton Makefile. Users will have to edit it to provide names, paths as needed, etc. but it is far easier than starting from scratch.&lt;/p&gt;
&lt;p&gt;Create a directory for the source files you wish to build and type&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;makemake 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;makemake&lt;/code&gt; script cannot distinguish files to be included in the build versus other files you may have in the directory. It will pick up all files ending in .c, .cxx, .cpp, .f, or .f90.  First edit the Makefile to remove any irrelevant file names.&lt;/p&gt;
&lt;p&gt;At minimum you must name your program through the PROG variable. You should also specify the name of your compiler explicitly; e.g. gcc not cc.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;phony&amp;rdquo; target &lt;code&gt;clean&lt;/code&gt; is common in Makefiles.  It makes it easy to remove all compiled files and start over.  At minimum, this is necessary when compiler
options are changed.&lt;/p&gt;
&lt;h3 id=&#34;makemake-skeleton&#34;&gt;Makemake Skeleton:&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&#34;language-make&#34;&gt;PROG = 

SRCS =  code.cxx file1.cxx file2.cxx 

OBJS =  code.o file1.o file2.o

LIBS = 

CC = cc

CXX = c++

CFLAGS = -O 

CXXFLAGS = -O

FC = f77 

FFLAGS = -O 

F90 = f90 

F90FLAGS = -O

LDFLAGS = 

all: $(PROG) 

$(PROG): $(OBJS)
        $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) 

.PHONY: clean

clean: 
        rm -f $(PROG) $(OBJS) *.mod 

.SUFFIXES: $(SUFFIXES) .f .f90 .F90 .f95

.SUFFIXES: $(SUFFIXES) .c .cpp .cxx 

.f90.o .f95.o .F90.o: 
        $(F90) $(F90FLAGS) -c $&amp;lt; 

.f.o: 
        $(FC) $(FFLAGS) -c $&amp;lt; 

.c.o: 
        $(CC) $(CFLAGS) -c $&amp;lt; 

.cpp.o .cxx.o:
        $(CXX) $(CXXFLAGS) -c $&amp;lt; 

main.o: code.cxx file1.h file2.h 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Exercise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copy or move your multi-file program into its own directory.
Run makemake in the directory.&lt;/p&gt;
&lt;p&gt;Edit the resulting Makefile appropriately. You may remove any lines pertaining to languages you aren&amp;rsquo;t using.&lt;/p&gt;
&lt;p&gt;Run make.&lt;/p&gt;
&lt;p&gt;Check that your executable works.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Configure</title>
      <link>/notes/building-running-c-cpp-fortran/configure/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/configure/</guid>
      <description>&lt;p&gt;The &lt;code&gt;configure&lt;/code&gt; is a way to generate a Makefile automatically.&lt;/p&gt;
&lt;p&gt;We will not discuss creating configure scripts, since they can be quite complex. But much software is distributed with them.  Configure usually takes many options and they vary by package. To see them, run from its directory&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;./configure --help
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Most configure scripts assume the software will be installed into /usr or /usr/local. You do not have permission to do this on an HPC system, so you will nearly always need to use the &lt;code&gt;-prefix&lt;/code&gt; option.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;./configure -prefix=/home/mst3k/udunits
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Configure should produce a Makefile.
When it has completed you can run &lt;code&gt;make&lt;/code&gt; as usual. This is usually followed by&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Refer to the documentation for your package for more details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exercise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copy udunits.tar.gz from /share/resources/tutorials/compilers&lt;/p&gt;
&lt;p&gt;Untar it (&lt;code&gt;tar xf udunits.tar.gz&lt;/code&gt;). Cd into its directory. Run&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;configure --help
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After examining the options, run it with at least the prefix option. You may wish to create a new directory for installing the package.&lt;/p&gt;
&lt;p&gt;Build the library.&lt;/p&gt;
&lt;p&gt;Install the library into the directory prepared for it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CMake</title>
      <link>/notes/building-running-c-cpp-fortran/cmake/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/cmake/</guid>
      <description>&lt;p&gt;
&lt;a href=&#34;https://cmake.org&#34;

 
    target=&#34;_blank&#34; 
    rel=&#34;noopener&#34;

&gt;CMake&lt;/a&gt; is a platform-independent build system.  Unlike configure, it can be used on Windows natively.  It is popular especially for software that must be built for multiple platforms.&lt;/p&gt;
&lt;p&gt;CMake usually requires the creation of a separate build directory below the top-level directory of the project.
CMake uses -D flags as the equivalents of many options to configure.
CMake caches your configuration into a file named CMakeCache.txt &amp;ndash; if you make changes you must remove this file or your changes will be ignored. It will be in the build directory if you created one.&lt;/p&gt;
&lt;h3 id=&#34;useful-cmake-flags&#34;&gt;Useful CMake Flags&lt;/h3&gt;
&lt;p&gt;You will often need to add&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;-DCMAKE_INSTALL_PREFIX=/path/to/install/location 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the equivalent of the &lt;code&gt;-prefix&lt;/code&gt; option to &lt;code&gt;configure&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;CMake does not pay (much) attention to your paths. It has its own means of finding compilers and libraries.  You may need to set some environment variables if you use a compiler loaded from an lmod module.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;-DCMAKE_C_COMPILER=gcc
-DCMAKE_CXX_COMPILER=g++
-DCMAKE_FC_COMPILER=gfortran 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are many versions of CMake and some CMake scripts provided by developers require a particular version or range of versions.  The system cmake may be old or not suitable. Newer versions are available through modules.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;module spider cmake
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The default module version should be sufficiently recent to build most cmake projects.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;module load cmake
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We will use an example prepared by Thom Troy (ttroy50 on GitHub)
Copy cmake-example.tar.gz from /share/resources/tutorials/compilers&lt;/p&gt;
&lt;p&gt;Extract the tar-file and cd to the directory it creates.&lt;/p&gt;
&lt;p&gt;Make an installation directory.&lt;/p&gt;
&lt;p&gt;Make a build directory. Cd into it.&lt;/p&gt;
&lt;p&gt;Load a compiler if you haven&amp;rsquo;t already, for example gcc.&lt;/p&gt;
&lt;p&gt;Load the cmake module.&lt;/p&gt;
&lt;p&gt;Run (type cmake command all on one line)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake .. -DCMAKE_INSTALL_PREFIX=/home/yourid/yourdir -DCMAKE_CXX_COMPILER=g++

make
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This simple example doesn&amp;rsquo;t create an installation target, so move the binary to the intended location.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Shared Memory Parallel Codes</title>
      <link>/notes/building-running-c-cpp-fortran/openmp/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/openmp/</guid>
      <description>&lt;p&gt;So far we have assumed that the code to be built is &lt;em&gt;serial&lt;/em&gt;, i.e it runs on a single core.  However, many programs that are intended to run on HPC systems make use of some form of parallelism.&lt;/p&gt;
&lt;p&gt;Shared-memory parallelism can be used on individual workstations, or on a single node of an HPC system, as long as multiple cores are present on the device.  Since nearly all modern computing devices are multicore, shared-memory parallelism is widely used in many domains.  Subprocesses called &lt;em&gt;threads&lt;/em&gt; are started by a root process. Each thread (including the root) is run on its own core.&lt;/p&gt;
&lt;p&gt;On a multinode HPC system, programs using shared-memory parallelism must be restricted to run on a single node. This is usually handled by a resource manager such as Slurm.  The directive for Slurm is&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#SBATCH --cpus-per-task=N
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#SBATCH -c N
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where N represents the number of cores requested. This directive ensures that all cores assigned to the job are on the same node.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenMP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OpenMP is one of the most popular libraries for this type of application.  OpenMP is built in to the compiler, so whether it is supported and which version is implemented is determined by the compiler vendor. It is invoked via the compiler and linker flags.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;gcc
&lt;code&gt;-fopenmp&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intel
&lt;code&gt;-qopenmp&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NVHPC
&lt;code&gt;-mp&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Exercise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copy omphello.c or omphello.f90 from /share/resources/compilers&lt;/p&gt;
&lt;p&gt;Using your choice of compiler, build an executable&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gcc &amp;ndash;fopenmp omphello.c&lt;/li&gt;
&lt;li&gt;icc &amp;ndash;qopenmp omphello.c&lt;/li&gt;
&lt;li&gt;pgcc &amp;ndash;mp omphello.c&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gfortran &amp;ndash;fopenmp omphello.f90&lt;/li&gt;
&lt;li&gt;ifort &amp;ndash;qopenmp omphello.f90&lt;/li&gt;
&lt;li&gt;pgfortran &amp;ndash;mp omphello.c&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add a &lt;code&gt;-o &amp;lt;name&amp;gt;&lt;/code&gt; flag to your build step if you want a name other than a.out.&lt;/p&gt;
&lt;p&gt;Generally the default for OpenMP is to detect the cores and create one thread per core in parallel regions. This is not always desirable for several reasons. We can specify the number of threads for parallel regions with an environment variable.  For OpenMP we use the OMP_NUM_THREADS environment variable.&lt;/p&gt;
&lt;p&gt;Run your executable with 4 threads:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;export OMP_NUM_THREADS=4
./a.out
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On shared, resource-managed systems like Rivanna, The thread number must equal the number of cores requested.  We can automate this with a Slurm built-in environment variable.  In your SLURM script set&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Building and Running C/C&#43;&#43; and Fortran Codes on the HPC System</title>
      <link>/notes/building-running-c-cpp-fortran/tutorial_landing_index/</link>
      <pubDate>Fri, 28 Feb 2020 00:00:00 -0500</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/tutorial_landing_index/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Distributed Memory Parallel Programs</title>
      <link>/notes/building-running-c-cpp-fortran/mpi/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/mpi/</guid>
      <description>&lt;p&gt;Programs using distributed-memory parallelism can run on multiple nodes. They consist of independent processes that communicate through a library, usually the &lt;em&gt;Message Passing Interface&lt;/em&gt;  MPI.&lt;/p&gt;
&lt;h2 id=&#34;building-and-running-mpi-programs&#34;&gt;Building and Running MPI Programs&lt;/h2&gt;
&lt;p&gt;MPI is an &lt;em&gt;external&lt;/em&gt; library. It must be built for the compiler with which it will be used.  We provide compiled versions of MPI for gcc and NVHPC.  For Intel we recommend using the vendor&amp;rsquo;s IntelMPI.&lt;/p&gt;
&lt;p&gt;OpenMPI with gcc and NVHPC&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module load gcc 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module load nvhpc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Follow this with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module load openmpi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Compile and link your code with the wrappers&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mpicc&lt;/code&gt; for C&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mpicxx&lt;/code&gt; for C++&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mpif90&lt;/code&gt; for Fortran&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The wrappers insert the appropriate header/module paths and library paths, and also the correct libraries to link. You do not add them explicitly.&lt;/p&gt;
&lt;p&gt;IntelMPI with Intel&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module load intel 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use the wrappers&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mpiicx&lt;/code&gt; for C&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mpiicpx&lt;/code&gt; for C++&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mpiifx&lt;/code&gt; for Fortran&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;running-mpi-programs&#34;&gt;Running MPI Programs&lt;/h2&gt;
&lt;p&gt;MPI programs must be run under the control of an executor program. Usually this is called &lt;code&gt;mpirun&lt;/code&gt; or &lt;code&gt;mpiexec&lt;/code&gt;, but when submitting to SLURM we must use &lt;code&gt;mpirun&lt;/code&gt; for OpenMPI and &lt;code&gt;srun&lt;/code&gt; for IntelMPI.  The executor must be told how many processes to start, and if on more than one host the list of host IDs must be provided. On a local system this is controlled by command-line options to &lt;code&gt;mpirun&lt;/code&gt;, e.g.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;mpirun -np 8 ./mympicode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, on Slurm the provided MPI executors obtain the number of processes and the hostlist directly from the job assignments. Do not specify them on the command line.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#Intel
srun ./mympicode 
#OpenMPI
mpirun ./mympicode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To request resources through Slurm for an MPI program, use the following directives&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#SBATCH -N NN
#SBATCH --ntasks-per-node=NT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where &lt;code&gt;NN&lt;/code&gt; is the number of nodes and &lt;code&gt;NT&lt;/code&gt; is the number of tasks (processes) to run on each node.  The total number of processes will be &lt;code&gt;NN*NT&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exercise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copy the file mpihello.c or mpihello.f90 from /share/resources/tutorials/compilers.  C++ programmers please note: the C++ bindings are deprecated in MPI, we just use the C routines.&lt;/p&gt;
&lt;p&gt;Load the appropriate module for the compiler you are using.&lt;/p&gt;
&lt;p&gt;Build the code with the appropriate wrapper.&lt;/p&gt;
&lt;p&gt;You can run a quick test on the frontend with 4 cores. You do not need a hostfile if all processes are on one node.&lt;/p&gt;
&lt;p&gt;Write a SLURM script using srun to run the program. Submit to the parallel partition for testing, using at least two nodes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Editors and Integrated Development Environments</title>
      <link>/notes/building-running-c-cpp-fortran/ide/</link>
      <pubDate>Tue, 14 Apr 2026 16:42:59 +0000</pubDate>
      <guid>/notes/building-running-c-cpp-fortran/ide/</guid>
      <description>&lt;p&gt;Integrated Development Environments (IDEs) are a graphical user interface for code development. A currently popular IDE is 
&lt;a href=&#34;https://code.visualstudio.com/&#34;

 
    target=&#34;_blank&#34; 
    rel=&#34;noopener&#34;

&gt;VSCode&lt;/a&gt;.  We recommend that VSCode be run through our Open OnDemand VSCode interactive application.&lt;/p&gt;
&lt;p&gt;Programmers who want to use a graphical user interface to edit source files, but not necessarily a full IDE, can use them on the FastX graphical 
&lt;a href=&#34;https://fastx.hpc.virginia.edu&#34;

 
    target=&#34;_blank&#34; 
    rel=&#34;noopener&#34;

&gt;frontend&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
