agenda –day 1 · l1 cache l2 cache l3 cache disk 1000 bytes 0.3 ns 64 kb 1 ns 256 kb 3 -10 ns 2-4...
TRANSCRIPT
![Page 1: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/1.jpg)
Agenda– Day1Time Title Presenter9:00-9:30 Welcome FrankMcKenna&You
9:30-11:30 TheVM,Linux&Git PeterMackenzie-Helnwein
11:30-12:00 AnIntroductionToProgramming Frank McKenna
12.00-1:00 LUNCH
1:00-3:00 TheCProgrammingLanguage FrankMcKenna
3:00-5:00 Exercises You
Day2 Debugging, ParallelProgramming withMPI&OpenMP
Day3 Abstraction, More C&C++
Day4 User InterfaceDesign &Qt
Day5 SimCenter &Cloud Computing
![Page 2: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/2.jpg)
NHERI
An Introduction to Programming &
The C Programming LanguageFrank McKenna
2
![Page 3: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/3.jpg)
Outline• AComputerProgramandtheComputeronWhichitRuns• CProgrammingLanguage
• Variables• Operations• ProgramControl• Functions• Pointers&Arrays• OtherThings
![Page 4: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/4.jpg)
WhatisaComputerProgram?
• Asequenceofseparateinstructionsoneafteranother• EachinstructiontellsCPUtodo1smallspecifictask
![Page 5: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/5.jpg)
ArtofProgramming- I
• Totakeaproblem,andcontinuallybreakitdownintoaseriesofsmallertasksuntilultimatelythesetasksbecomeaseriesofsmallspecificindividualinstructions.
![Page 6: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/6.jpg)
WhatisProgramming?• Writingtheseinstructionsasaseriesofstatements.• Astatementusewords,numbersandpunctuationtodetailtheinstruction.TheyarelikeproperlyformedsentencesinEnglish.
• Apoorlyformedstatement->compilererror• Eachprogramminglanguagehasaunique“syntax”
![Page 7: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/7.jpg)
WhatProgrammingLanguage?
• Hundredsoflanguages….• Onlyadozenorsoarepopularatanytime• WewillbelookingatCandC++
![Page 8: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/8.jpg)
TypesofLanguages– Compiled/Interpreted• Compiled:
• Interpreted.
• Hybrid,e.g.Java.Compilerconvertstoanotherlangauge,e.g.bytecode.Interpreterrunsonmachineandinterpretsthislanguage,e.g.javaVM.
ExCPU
ExecutableFile
Interpreter00111011100011100001
CPUEvaluatesusingCPU
![Page 9: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/9.jpg)
JavaScriptRuby,Python
JavaC++
CFortran
AssemblyLanguage
Low-Level
High-Level
MachineCode
CPU
ProgrammingLanguageHierarchyEaseofDevelopment
ProgramPerformance
![Page 10: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/10.jpg)
SingleProcessorMachine– IdealizedModelCPU Memory
Control
Arithmetic
Registers
Fetches,decodes&dispatchesinstructions
Performsnumericaloperations
DatafromMemory
Disk
![Page 11: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/11.jpg)
• Anapplicationwhosepurposeisto:• CheckaProgramislegal(followsthesyntax)• Translatetheprogramintoanotherlanguage(assembly,machineinstruction)
WhatisaCompiler?
voidman(){……a=b+c;……
}
voidman(){…loadaintoR1loadbintoR2R3=R1+R2storeR3intoc…
}
COMPILER
![Page 12: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/12.jpg)
CPUonlyWorksonDatainRegisters!
![Page 13: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/13.jpg)
MemoryHierarchyProcessor
Control
Arithmetic
Registers
Memory(RAM)DiskL1Cache L2Cache L3Cache
1000Bytes0.3ns
64KB1ns
256KB3-10ns
2-4MB20-30ns
4-16GB50-100ns
4-16TB5-10e6ns
.25-1TB25-50e3ns
SizeLatency
HW HW HW OperatingSystem
OperatingSystemCompiler
![Page 14: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/14.jpg)
WhatisCache?• Small,FastMemory• PlacedBetweenRegistersandMainMemory• Itkeepsacopyofdatainmemory• Itishiddenfromsoftware(neithercompilerorOScansaywhatgetsloaded)
• Cache-hit:dataincache(bincache)• Cache-miss:datanotincache,havetogogetfrommemory(binmemory)• Cache-line-length:numberofbytesofdataloadedintocachewithmissingdata(32to128bytes)
voidmain(){…
loadbintoR2…
}
![Page 15: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/15.jpg)
WhyDoCachesWork?• SpatialLocality– probabilityishighthatifprogramisaccessingsomememoryon1instruction,itisgoingtoaccessanearbyonesoon
• TemporalLocality– probabilityishighthatifprogramisaccessingsomememorylocationitwillaccesssamelocationagainsoon.
int main(){…doubledotProduct =0for(int i=0,i<vectorSize;i++)dotProduct +=x[i]*y[i];
…}
![Page 16: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/16.jpg)
SoWhyDidIBringCacheUpIfNoControlOverIt?
• Knowingcachesexist,understandinghowtheywork,allowsyouasaprogrammertotakeadvantageofthemwhenyouwritetheprogram
![Page 17: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/17.jpg)
ProgramMemory– MainMemoryMismatch
Memory(RAM)
![Page 18: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/18.jpg)
VirtualMemory• Isamemorymanagement techniquethatprovidesan"idealizedabstractionofthestorageresourcesthatareactuallyavailableonagivenmachine”wikipedia.
• ProgramMemoryisbrokenintoanumberofpages.Someoftheseareinmemory,someondisk,somemaynotexistatall(segmentationfault)
• CPUissuesvirtualaddresses(loadbintoR1)whicharetranslatedtophysicaladdresses.Ifpageinmemory,HWdeterminesthephysicalmemoryaddress.Ifnot,pagefault,OSmustgetpagefromDisk.
• PageTable:tableofpagesinmemory.• PageTableLookup– relativily expensive.• PageFault(pagenotinmemory)veryexpensiveaspagemustbebroughtfromdiskbyOS
• PageSize:sizeofpages• TLBTranslationLook-AsideBufferHWcacheofvirtualtophysicalmappings.
• Allowsmultipleprogramstoberunningatonceinmemory.
![Page 19: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/19.jpg)
![Page 20: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/20.jpg)
TheCProgrammingLanguage
• OriginallyDevelopedbyDennisRitchieatBellLabsin1969toimplementaUNix operatingsystem.
• Itisacompiled language
• Itisastructured (PROCEDURAL)language
• Itisastronglytypedlanguage
• Themostwidelyusedlanguagesofalltime
• It’sbeen#1or#2mostpopularsincemid80’s• Itworkswithnearlyallsystems• Asclosetoassemblyasyoucanget• Smallruntime(embeddeddevices)
![Page 21: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/21.jpg)
CProgramStructure
ACProgramconsistsofthefollowingparts:• PreprocessorCommands• Functions• Variables• Statements&Expressions• Comments
![Page 22: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/22.jpg)
Everyone’sFirstCProgram
#include <stdio.h>
int main() { /* my first program in C */ printf("Hello World! \n"); return 0;
}
• Thefirstlineoftheprogram#include<stdio.h> isapreprocessorcommand,whichtellsaCcompilertoincludethestdio.h filebeforestartingcompilation.
• Thenextlineint main() isthemainfunction.Everyprogrammusthaveamainfunctionasthatiswheretheprogramexecutionwillbegin.
• Thenextline/*...*/ willbeignoredbythecompiler.Itistherefortheprogrammerbenefit.Itisacomment.
• Thenextlineisastatementtoinvoketheprintf(...)functionwhichcausesthemessage"Hello,World!"tobedisplayedonthescreen.Theprototypeforthefunctionisinthestdio.h file.It’simplementationinthestandardClibrary.
• Thenextstatementreturn0; terminatesthemain()functionandreturnsthevalue0.
nospacebetween#andinclude
statementsendwith;Functionthatindicatestheywillreturnaninteger,MUSTreturnaninteger
hello1.c
![Page 23: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/23.jpg)
Exercise:Compile&RunHelloWorld!
1. With a text editor create the file hello.cin a terminal window type: gedit hello.c
2. Compile it in a terminal window type: gcc hello.c
3. Run itin a terminal window type: ./a.out #include <stdio.h>
int main() { // my first program in Cprintf("Hello World! \n"); return 0;
}
AcommentmayalsobeSpecifiedusinga//.ThecompilerignoresalltextfromcommenttoEOL
![Page 24: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/24.jpg)
VariablesandTypes• Exceptinsimplestofprogramsweneedtokeeptrackofdata,e.g.currentandmaxscoresinagame,currentsuminvectorproductcalculation
• A Variableisa nameaprogrammercansetasideforstoring&accessingaccessingamemorylocation.
• Cisastronglytypedlanguage.Theprogrammermustspecifythedatatypeassociatedwiththevariable.
• Namesaremadeupoflettersanddigits;theyare casesensitive;namesmuststartwithacharacter,forvariablenames‘_’countsasachracacter
• Certainkeywordsarereserved,i.e.cannotbeusedasvariablenames
![Page 25: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/25.jpg)
ReservedKeywordsinC
![Page 26: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/26.jpg)
VariableExample#include <stdio.h>// define and then set variableint main(int argc, const char **argv) {int a;a = 1;printf("Value of a is %d \n",a);return(0);
}
#include <stdio.h>// define & set in 1 statementint main(int argc, const char **argv) {int a = 1;printf("Value of a is %d \n",a);return(0);
}
UninitializedVariable InitializedVariable
var2.cvar1.c
![Page 27: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/27.jpg)
AllowableVariableTypesinC- Icharintfloat doublevoid
#include <stdio.h>#include <stdlib.h>
int main(int argc, const char **argv) {int i1 = 5;float f1 = 1.2;double d1 = 1.0e6;char c1 = 'A';printf("Integer %d, float %f, double %f, char %c \n", i1, f1, d1, c1);return(0);
}
var3.c
![Page 28: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/28.jpg)
AllowableVariableTypesinC– IIqualifiers:unsigned,short,long
1.IntegerTypes 2.FloatingPointTypes
3.EnumeratedTypes
4.void Type
5.DerivedTypes
Structures,Unions,Arrays
![Page 29: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/29.jpg)
Arrays- I• Afixedsizesequentialcollectionofelementslaidoutinmemoryofthesametype.Weaccessusinganindexinsideasquarebrackets,indexingstartat0
• todeclare:type arrayName [size]; type arrayName [size] = {size comma separated values}
#include <stdio.h>
int main(int argc, const char **argv) {int intArray[5] = {19, 12, 13, 14, 50};intArray[0] = 21;int first = intArray[0];int last = intArray[4];printf("First %d, last %d \n", first, last);return(0);}
19 12 13 14 50
a[0] a[1] a[2] a[3] a[4]
WARNING:indexingstartsat0
21
array1.c
![Page 30: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/30.jpg)
MultidimensionalArrays- I• Afixedsizesequentialcollectionofelementslaidoutinmemoryofthesame type.Weaccessusinganindexinsideasquarebrackets,indexingstartat0
• todeclare:type arrayName [l1][l2][l3]…; type arrayName [l1][l2][l3] = {l1*l2*… comma separated values}
#include <stdio.h>
int main(int argc, const char **argv) {double dArray[2][4]= {{19.1, 12, 13, 14e2},
{21.2, 22, 23, 24.2e-3}};dArray[0][0] = 101.5;int first = dArray[0][0];int last = dArray[1][3];printf("First %f, last %f \n", first, last);return(0);}
19 12 13 1400101.5
19 22 23 .024221
var1.c
array2.c
a[1][0]
a[0][0]
a[1][3]
a[0][3]
![Page 31: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/31.jpg)
MemoryLayoutofArraysinCandFortran
Fortran
C double matrix[3][3];
REAL matrix(3,3);
![Page 32: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/32.jpg)
Operations• Wewanttodostuffwiththedata,tooperateonit• BasicArithmeticOperations
+,-,*,/,%#include <stdio.h>
int main(int argc, const char **argv) {int a = 1;int b = 2;int c = a+b;printf("Sum of %d and %d is %d \n",a,b,c);return(0);
}
op1.c
![Page 33: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/33.jpg)
YouCanStringOperationsTogether–#include <stdio.h>int main(int argc, const char **argv) {int a = 5; int b = 2; int c = a + b * 2; printf("%d + %d * 2 is %d \n",a,b,c);
c = a * 2 + b * 2; printf("%d * 2 + %d * 2 is %d \n",a,b,c);
// use parentheses c = ((a * 2) + b ) * 2; printf("((%d * 2) + %d ) * 2; is %d \n",a,b,c); return(0);
}
Whatisc?Operatorprecedence!
USEPARENTHESES
op2.c
![Page 34: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/34.jpg)
![Page 35: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/35.jpg)
SomeOperationsaresoCommontherearespecialoperators
#include <stdio.h>int main() {
…a = a + 1;…
}
a += 1;
a ++;
+=-=*=/=++--
![Page 36: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/36.jpg)
• Sofarinstructionsequencehasbeensequential,oneinstructionafterthenext..Beyondsimpleprogramsweneedtostartdoingsomething,ifbalanceislessthan0don’twithdrawmoney
if (condition) {// code block
}ConditionalCode– ifstatement
#include <stdio.h>int main(int argc, const char **argv) {int a=15;if(a<10){printf("%dislessthan10\n",a);}if(a==10){printf("%disequalto10\n",a);}if(a>10){printf("%disgreaterthan10\n",a);}return(0);
}
<<=>>===!=
ConditionalOperators
if1.c
![Page 37: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/37.jpg)
If-else
#include <stdio.h>int main(int argc, const char **argv) {int a=15;if(a<=10){if(a!=10){printf("%dislessthan10\n",a);
}else{printf("%disequalto10\n",a);}
}else{printf("%disgreaterthan10\n",a);
}return(0);
}
#include <stdio.h>int main(int argc, const char **argv) {int a=15;if(a<10){printf("%dislessthan10\n",a);
}elseif(a==10){printf("%disequalto10\n",a);
}else{printf("%disgreaterthan10\n",a);
}return(0);
}
else-if
Canhavemultipleelseifinifstatement
if (condition) {
// code block
} else {
// other code
}
if (condition) {
// code block
} else if (condition) {
// another code block
} else {
// and another
}if2.c
if3.c
![Page 38: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/38.jpg)
Logicaland/or/not#include <stdio.h>int main(int argc, const char **argv) {int a=15;if((a<10)&&(a==10)){if!(a==10){printf("%dislessthan10\n",a);
}else{printf("%disequalto10\n",a);}
}else{printf("%disgreaterthan10\n",a);
}return(0);
}
&&|||
![Page 39: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/39.jpg)
ConditionalCode– switchstatement• Specialmulti-waydecisionmakerthattestsifanexpressionmatchesoneofanumberofconstant values
#include <stdio.h>int main(int argc, const char **argv) {char c=‘Y’; switch (c) { case ‘Y’:case ‘y’:c = ‘y’;break;
default:printf(”unknown character %c \n",c);
} return(0);
}
switch(expression){caseconstant-expression:
statement(s);break;/*optional*/
caseconstant-expression:statement(s);break;/*optional*/
…..default:/*Optional*/
statement(s);}
![Page 40: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/40.jpg)
• Commontaskistoloopoveranumberofthings,e.g.lookatallfilesinafolder,loopoverallvaluesinanarray,…
while (condition) {// code block
}Iteration/loops- while
#include <stdio.h>
int main(int argc, const char **argv) {int intArray[5] = {19, 12, 13, 14, 50};int sum = 0, count = 0;while (count < 5) {sum += intArray[count];count++;
}printf(”sum is: %d \n”, sum);}
If you do enough while loops you will recognize a pattern1) Initialization of some
variables, 2) condition, 3) increment of some value
Hence the for loop
//Ifleftout=>infiniteloop..//Somethingmusthappeninwhiletobreakoutofloop
while1.c
![Page 41: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/41.jpg)
forloop
for (init; condition; increment) {// code block
}
#include <stdio.h>
int main(int argc, const char **argv) {int intArray[5] = {19, 12, 13, 14, 50};int sum = 0;for (int count = 0; count < 5; count++) {sum += intArray[count];
}printf(”sum is: %d \n”, sum);}
for1.c
![Page 42: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/42.jpg)
forloop– multipleinit &increment
for (init; condition; increment) {// code block
}
#include <stdio.h>
int main(int argc, const char **argv) {int intArray[6] = {19, 12, 13, 14, 50, 0};int sum = 0;for (int i = 0, j=1; i < 5; i+=2, j+=2) {sum += intArray[i] + intArray[j];
}printf(”sum is: %d \n”, sum);}
for2.c
![Page 43: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/43.jpg)
Exercise:Codetocountnumberofdigits,whitespaces(‘‘,‘\n’,’\t’)andothercharinafile.Writeinfoout.
1. gedit count.c2. gcc hello.c3. ./a.out << count.c
#include <stdio.h> int main() {
int nDigit =0, nWhite =0, nOther = 0;while ((c = getchar()) != EOF) {
// your code}// some more code here
}
![Page 44: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/44.jpg)
Pointers&Addresses(beforeIstartusingtheminexamples)• YouwillusepointersanawfullotifyouwriteanymeaningfulCcode.• Rememberwhenyoudeclarevariablesyouaretellingcompilertosetasidesomememorytoholdaspecifictypeandyourefertothatmemorywhenyouusethename,e.g.int x.Whenyouspecifyapointer,youareseeting asideamemaddress.
• Theunary& givesthe“address”ofanobjectinmemory.• Theunary*inadeclarationindicatesthattheobjectisapointertoanobjectofaspecifictype• Theunary* elsewheretreatstheoperandasanaddress,anddependingonwhichsideofoperandeithersetsthecontentsatthataddressorfetchesthecontents.#include <stdio.h> int main() {
int x =10, y;int *ptrX =0;
ptrX = &x;y = *ptrX + x;
}
x y ptrX
10 drivel 0
x y ptrX
10 20 00023478650
voidman(){…loadptrX intoR1loadR1intoR2loadxintoR3R4=R2+R3storeR4intoy…pointer1.c
![Page 45: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/45.jpg)
Functions• ArtofProgrammingI:“Totakeaproblem,andrecusivily breakitdownintoaseriesofsmallertasksuntilultimatelythesetasksbecomeaseriesofsmallspecificindividualinstructions.”
• Forlargecodeprojectsthewedonotputallthecodeinsideasinglemainblock
• Webreakitupintological/meaningfulblocksofcode.Inobject-orientedprogrammingwecalltheseblocksclasses,inproceduralprogrammingwecalltheseblocksproceduresorfunctions.
• Functionsmakelargeprogramsmanageable:easiertounderstand,allowforcodere-use,allowittobedevelopedbyteamsofprogrammers,..
![Page 46: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/46.jpg)
CFunctionreturnType funcName (funcArgs) {
codeBlock}
• returnType <optional>:whatdatatypethefunctionwillreturn,ifnoreturnisspecifiedreturnType isint.Ifwantfunctiontoreturnnothingthereturntospecifyisvoid.
• funcName:thenameofthefunction,youusethisnamewhen“invoking”thefunctioninyourcode.
• funcArgs:commaseperated listofargs tothefunction.• codeBlock:containsthestatementstobeexecutedwhenprocedureruns.Theseareonlyeverrunifprocedureiscalled.
![Page 47: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/47.jpg)
#include <stdio.h>
// function to evaluate vector sumint sumArray(int *data, int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += data[i];
}return sum;
}
int main(int argc, const char **argv) {int intArray[6] = {19, 12, 13, 14, 50, 0};int sum = sumArray(intArray, 6);printf(”sum is: %d \n”, sum);return(0);}
#include <stdio.h>// function to evaluate vector sumint sumArray(int *data, int size) {int sum = 0;for (int i = 0; i < size; i++) {
sum += *data++;}return sum;
}
int main(int argc, const char **argv) {int intArray1[6] = {19, 12, 13, 14, 50, 0};int intArray2[3] = {21, 22, 23};int sum1 = sumArray(intArray1, 6);int sum2 = sumArray(intArray2, 3);printf(”sums: %d and %d\n”, sum1, sum2);return(0);}
int *:dataisapointertoanintfunction1.c function2.c
![Page 48: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/48.jpg)
#include <stdio.h>
int main(int argc, const char **argv) {int intArray1[6] = {19, 12, 13, 14, 50, 0};int intArray2[3] = {21, 22, 23};int sum1 = sumArray(intArray1, 6);int sum2 = sumArray(intArray2, 3);printf(”sums: %d and %d\n”, sum1, sum2);return(0);}// function to evaluate vector sumint sumArray(int *data, int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += *data++;
}return sum;
}
int sumArray(int *, int);
FunctionPrototype
Good practice to give the args names
function3.c
int sumArray(int *arrayData, int size); int sumArray(int *arrayData, int size);
![Page 49: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/49.jpg)
GoodPractice:1. Forlargeprogramsitisagoodideatoputfunctionsintodifferent
files(manydifferentpeoplecanbeworkingondifferentpartsofthecode)
2. Ifnottoolarge,puttheminlogicalunits,i.e.allfunctionsdealingwithvectoroperationsin1file,matrixoperationsinanother.
3. Putprototypesforallfunctionsinanotherfile.4. Iffunctionlarge,putinseparatefile.5. Getintoasystemofdocumentinginputsandoutputs.
![Page 50: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/50.jpg)
#include <stdio.h>#include “myVector.h”int main(int argc, const char **argv) {int intArray[6] = {19, 12, 13, 14, 50, 0};int sum;sum = sumArray(intArray, 6);printf(”sum is: %d \n”, sum);}}
// function to evaluate vector sum// inputs:// data: pointer to integer array// size: size of the array// outputs://// return:// integer sum of all valuesint sumArray(int *data, int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += data[i];
}return sum;
}
myVector.cmain.c
myVector.hint sumArray(int *arrayData, int size);int productArray(int *arayData, int size);int normArray(int *arrayData, int size);int dotProduct(int *array1, int *array2, int size);
![Page 51: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/51.jpg)
Exercise:Writeafunctiontosumtwovalues
1. gedit sumc2. gcc sum.c3. ./a.out
#include <stdio.h> int sumInt(int a, int b);int main() { int integer1,integer2,sum;printf("Enterfirstinteger:");scanf("%d",&integer1);//readinputtointeger1printf("Entersecondinteger:");scanf("%d",&integer2);//Readinputintointeger2sum = sumInt(integer1, integer2);printf(“sum %d + %d = %d\n”, integer1, integer2, sum);return(0);}
// your code here}
&integer1:memoryaddressofinteger1
&integer2:memoryaddressofinteger2
![Page 52: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/52.jpg)
PassByValue,PassbyReference• C(unlikesomelanguages)allargs arepassedbyvalue
#include <stdio.h> sumInt(int1,int2,&sum);
int main() { int int1, int2, sum=0; printf("Enter first integer: ");scanf("%d", &int1); printf("Enter second integer: "); scanf("%d", &int2); sumInt(int1, int2, sum);print(”%d + %d = %d \n”, int1, int2, sum)
}voidsumInt(int a,int b,int *sum){
*sum=a+b;
}
tochangethefunctionargumentinthecallers“memory”wecanpasspointertoit,i.e it’saddressinmemory.
ThisisUsefulifyouwantmultiplevariableschanged,orwanttoreturnanerrorcodewiththefunction.
function4.c
![Page 53: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/53.jpg)
MathFunctionsin<math.h>,linkwith-lm
#include <stdio.h> int main() { double a = 34.0;
double b = sqrt(a);print(”%f + %f = %f \n”, a, b)return 0;
}
![Page 54: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/54.jpg)
ScopeofVariables#include <stdio.h> int sum(int, int); int x = 20; //globalvariable int main(int argc, const char **argv) { printf("LINE5:x = %d\n",x);
int x = 5; printf("LINE8:x = %d\n",x); if (2 > 1) { int x = 10; printf("LINE12:x = %d\n",x);
} printf("LINE14:x = %d\n",x);
x = sum(x,x); printf("LINE17:x = %d\n",x);
} int sum(int a, int b) { printf("LINE21:x = %d\n",x); return a+b;
}
scope1.c
![Page 55: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/55.jpg)
Recursion
• Recursionisapowerfulprogrammingtechniquecommonlyusedindivide-and-conquersituations.
#include <stdio.h>#include <stdlib.h>int factorial(int n);int main(int argc, const char **argv) {if (argc < 2) {printf("Program needs an integer
argument\n");return(-1);
}int n = atoi(argv[1]);int fact = factorial(n);printf("factorial(%d) is %d\n",n, fact);return 0;
} iint factorial(int n) {
if (n == 1)return 1;
elsereturn n*factorial(n-1);
}
recursion1.c
![Page 56: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/56.jpg)
Arrays- II• Anarrayisfixedsizesequentialcollectionofelementslaidoutinmemoryofthesame type.Weaccessusinganindexinsideasquarebrackets,indexingstartat0
• todeclare:type arrayName [size]; type arrayName [size] = {size comma separated values}
• Worksforarrayswhereweknowthesizeatcompiletime.Therearemanytimeswhenwedonotknowthesizeofthearray.
• Needtousepointers andfunctionsfree()andmalloc()type *thePointer = (type *)malloc(numElements*sizeof(type));…
free(thePointer)
• Memoryforthearrayusingfree()comesfromtheheap• Alwaysremembertofree()thememory..Otherwisecanrunoutofmemory.
![Page 57: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/57.jpg)
pointer,malloc()and
free()
#include <stdio.h>#include <stdlib.h>
int main(int argc, const char **argv) {int n;double *array1=0, *array2=0, *array3=0;
// get nprintf("enter n: ");scanf("%d", &n); if (n <=0) {printf (“You idiot\n”); return(0);}
// allocate memory & set the data array1 = (double *)malloc(n*sizeof(double));for (int i=0; i<n; i++) {
array1[i] = 0.5*i;}array2 = array1;array3 = &array1[0];
for (int i=0; i<n; i++, array3++) {double value1 = array1[i];double value2 = *array2++;double value3 = *array3;printf("%.4f %.4f %.4f\n", value1, value2, value3);
}// free the array free(array1);return(0);
}
memory1.c
![Page 58: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/58.jpg)
Pointersto
pointers&
multi-dimen
sion
alarrays
#include <stdio.h> #include <stdlib.h> intmain(intargc,constchar**argv){intn;double**matrix1=0;
printf("entern:");scanf("%d",&n);
//allocatememory&setthedatamatrix1=(double**)malloc(n*sizeof(double*));for(inti=0;i<n;i++){matrix1[i]=(double*)malloc(n*sizeof(double));for(intj=0;j<n;j++)matrix1[i][j]=i;
}for(inti=0;i<n;i++){for(intj=0;j<n;j++)printf("(%d,%d)%.4f\n",i,j,matrix1[i][j]);
}//freethedatafor(inti=0;i<n;i++)
free(matrix1[i]);free(matrix1);}
memory2.c
![Page 59: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/59.jpg)
double **matrix2 =0; matrix2= (double **)malloc(numRows*sizeof(double *)); for (int i=0; i<numRows; i++) {
matrix2[i] = (double *)malloc(numCols*sizeof(double)); for (int j=0; j<numCols; j++)
matrix2[i][j] = i; }
BecausemanyprebuiltlibrariesworkassumingcontinuouslayoutandFortrancolumn-majororder:
double *matrix2 =0; matrix2= (double *)malloc(numRows*numCols*sizeof(double *)); for (int i=0; i<numRows; i++) {
for (int j=0; j<numCols; j++) matrix2[I+j*numRows] = i;
}
forCompatibilitywithmanymatrixlibrariesthisispoorcode:
double *matrix2 =0; matrix2= (double *)malloc(numRows*numCols*sizeof(double *));for (int j=0; j<numCols; j++)
for (int i=0; i<numRows; i++) { matrix2[I+j*numRows] = i;
}
double **matrix2 =0; matrix2= (double **)malloc(numRows*numCols*sizeof(double *));double*dataPtr =matrix2;for (int j=0; j<numCols; j++)
for (int i=0; i<numRows; i++) { *dataPtr++ = i;
}
memory3.c
![Page 60: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/60.jpg)
SpecialProblems:char*andStrings• Nostringdatatype,stringinCisrepresentedbytypechar*• Therearespecialfunctionsforstringsin<string.h>
• strlen()• strcpy()• ….
• Tousethemrequiresaspecialcharacteratendofstring,namely‘\0’• Thiscancausenoendofgrief,e.g.ifyouusemalloc,youneedsize+1andneedtoappend‘\0’
#include<string.h>….chargreeting[]="Hello";int length=strlen(greeting);printf("%sastringoflength%d\n",greeting,length);
char*greetingCopy =(char*)malloc((length+1)*sizeof(char));strcpy(greetingCopy,greeting);
![Page 61: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/61.jpg)
WARNING
• ArraysandPointersarethesourceofmostbugsinCCode• YouwillhavetousethemifyouprograminC• Alwaysinitializeapointerto0• Becarefulyoudonotgobeyondtheendofanarray
• Bethankfulforsegmentationfaults• Ifyouhavearacecondition(getdifferentanswerseverytimeyourun,probablyapointerissue)
![Page 62: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/62.jpg)
WhatWeNeglected
• FileI/O• Struct• ….Andsomeotherstuff(notnecessarilyminor)
• References• Operatingonbits
![Page 63: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/63.jpg)
PracticeExercises(1hour):asmanyasyoucan
1. Writeaprogramthatwhenrunningpromptstheuserfortwofloatingpointnumbersandreturnstheirproduct.• i.e../a.out wouldpromptfor2numbersaandbwilloutputa*b=something
2. Writeaprogramthattakesanumberofintegervaluesfromargc,storestheminanarray,computesthesumofthearrayandoutputssomenicemessage.Tryusingrecursiontocomputethesum.(hintstartwithrecursion1.candgooglefunctionatof(),copyfrommemory1.c)• i.e../a.out 345.56willoutput3+4+5.5+6=18.5
3. Takingthepreviousprogram.Modifyittooutputthenumberofuniquenumbersintheoutput.• i.e../a.out 31.12.01.1willoutput3+2*1.1+2.0=7.7
4. Writeaprogramthattakesanumberofinputvaluesandsortstheminascendingorder.• I.e../a.out 27459willoutput24579
![Page 64: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/64.jpg)
Exercise:ComputePI
#include<stdio>staticint longnumSteps =100000;int main(){doublepi=0;doubletime=0;//yourcodefor(int i=0;i<numSteps;i++){//yourcode
}//yourcodeprintf(“PI=%f,duration:%fms\n”,pi,time);return0;}
Source:UCBerkeley,TimMattson(IntelCorp),CS267&elsewhere
![Page 65: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/65.jpg)
Exercise:Matrix-MatrixMultiply
![Page 66: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/66.jpg)
66
Naïve Matrix Multiply{implements C = C + A*B}for i = 1 to n{read row i of A into fast memory}for j = 1 to n
{read C(i,j) into fast memory}{read column j of B into fast memory}for k = 1 to n
C(i,j) = C(i,j) + A(i,k) * B(k,j){write C(i,j) back to slow memory}
= + *C(i,j) A(i,:)
B(:,j)C(i,j)
Source:UCBerkeley,JimDemmell,CS267
![Page 67: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/67.jpg)
67
Blocked (Tiled) Matrix MultiplyConsider A,B,C to be N-by-N matrices of b-by-b subblocks where b=n / N is block size
for i = 1 to Nfor j = 1 to N
{read block C(i,j) into fast memory}for k = 1 to N
{read block A(i,k) into fast memory}{read block B(k,j) into fast memory}C(i,j) = C(i,j) + A(i,k) * B(k,j) {do a matrix multiply on blocks}
{write block C(i,j) back to slow memory}
= + *C(i,j) C(i,j) A(i,k)
B(k,j)
blocksize=loopbounds
cachedoesthisautomatically
3nestedloopsinside
Tilingforregisters(managedbyyou/compiler)orcaches(hardware)
Source:UCBerkeley,JimDemmell,CS267
![Page 68: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/68.jpg)
Recursive Matrix Multiplication (RMM) (1/2)C = = A · B = ·
=
= � =
• True when each bock is a 1x1 or n/2 x n/2• For simplicity: square matrices with n = 2m
• Extends to general rectangular case
A11 A12 A21 A22
B11 B12 B21 B22
C11 C12 C21 C22
A11·B11 + A12·B21 A11·B12 + A12·B22 A21·B11 + A22·B21 A21·B12 + A22·B22
C11 C12
C21 C22
A11 A12
A21 A22
B11 B12
B21 B22
A11*B11 +A12*B21
A11*B12 +A12*B22
A21*B11 +A22*B21
A21*B12 +A22*B22
68Source:UCBerkeley,JimDemmell,CS267
![Page 69: Agenda –Day 1 · L1 Cache L2 Cache L3 Cache Disk 1000 Bytes 0.3 ns 64 KB 1 ns 256 KB 3 -10 ns 2-4 MB 2030 ns 4-16 GB 50-100 ns 4-16 TB 5 -10e6 ns.25-1TB 2550e3 ns Size Latency HW](https://reader036.vdocuments.net/reader036/viewer/2022062914/5e77ca800544ee31b45dfbf3/html5/thumbnails/69.jpg)
Recursive Matrix Multiplication (2/2)func C = RMM (A, B, n)
if n=1, C = A * B, else{ C11 = RMM (A11 , B11 , n/2) + RMM (A12 , B21 , n/2)
C12 = RMM (A11 , B12 , n/2) + RMM (A12 , B22 , n/2)C21 = RMM (A21 , B11 , n/2) + RMM (A22 , B21 , n/2)C22 = RMM (A21 , B12 , n/2) + RMM (A22 , B22 , n/2) }
return
A(n) = # arithmetic operations in RMM( . , . , n)= 8 · A(n/2) + 4(n/2)2 if n > 1, else 1= 2n3 … same operations as usual, in different order
W(n) = # words moved between fast, slow memory by RMM( . , . , n)= 8 · W(n/2) + 4· 3(n/2)2 if 3n2 > Mfast , else 3n2
= O( n3 / (Mfast )1/2 + n2 ) … same as blocked matmulDon’t need to know Mfast for this to work!
Source:UCBerkeley,JimDemmell,CS267