рд╡рд┐рдВрдбреЛрдЬ 8: Intel┬о рдереНрд░реЗрдбрд┐рдВрдЧ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдирд╛

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ (рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ рдРрдк) рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдпрдХрд▓рд╛рдкреЛрдВ рдХреА рдХрдореА рд╣реИ, рдЬреЛ CreateThread () рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдФрд░ рдЯреАрдПрд▓рдПрд╕ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдФрд░ рдпрд╣ рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рд╕реНрдЯрдо-рдирд┐рд░реНрднрд░ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдЧрдгрдирд╛ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рд╣реИред рдпрд╣ рдкреЛрд╕реНрдЯ рд╕рд░рд▓ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ (рд╡рд┐рдВрдбреЛрдЬ рдРрдк рдкреНрд░рдорд╛рдгрди рдХрд┐рдЯ рд╕рддреНрдпрд╛рдкрди) рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рд▓реМрдХрд┐рдХ рдкреИрдорд╛рдиреЗ рдХреЗ рдЦрд┐рд▓реМрдиреЗ рддрдХ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рдЗрдВрдЯреЗрд▓ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд┐рдВрдЧ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдЗрдВрдЯреЗрд▓ рдЯреАрдмреАрдмреА, рдЯреАрдмреАрдмреА, рдереНрд░реЗрдбрд┐рдВрдЧрдмрд┐рд▓реНрдбрд┐рдВрдЧрдмреНрд▓реЙрдХ.рдУрдЖрд░рдЬреА ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рднрд╛рдЧ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдПрдХ рдирдпрд╛ рд╕реБрдВрджрд░ рдЪрд┐рддреНрд░рдордп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬрд╛рд░реА рдЗрдВрдЯреЗрд▓ рдЯреАрдмреАрдмреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА tbb41_20121112oss, рдЬреЛ рд╣рдорд╛рд░реА рдереНрд░реЗрдбрд┐рдВрдЧрдмрд┐рд▓реНрдбрдмреНрд▓реЙрдХ рдбреЙрдЯ рдУрдЖрд░рдЬреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рдиреЗ рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЕрдзрд┐рдХреГрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЗрдВрдЯреЗрд▓ рдЯреАрдмреАрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЕрдирдЬрд╝рд┐рдк рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░рд┐рд▓реАрдЬрд╝ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреВрдбрд┐рдпреЛ 2012 рдХреЗ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рд╣рдо рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ

gnumake tbb tbbmalloc target_ui=win8ui target_ui_mode=production 

рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ, рд╕рдм рдХреБрдЫ, рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдЬрд╛рдУред
рд╣рдо рдорд╛рдирдХ рдЯреЗрдореНрдкрд▓реЗрдЯ "рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реА ++" -> "рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ "рдмреНрд▓реИрдВрдХ рдРрдк (рдПрдХреНрд╕рдПрдПрдордПрд▓)" рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ "App1" рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рджреЗрдВред
рдЕрдм рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдЬреЛрдбрд╝реЗрдВ <tbb directory> / рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ "рдПрдбрд┐рд╢рдирд▓ рдЗрдВрдХреНрд▓реВрдб рдбрд┐рд░реЗрдХреНрдЯрд░реАрдЬрд╝" рдФрд░ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдЗрди рдмрд┐рд▓реНрдЯ-рдЗрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА tbb.lib рдХреЗ рд╕рд╛рде "рдЕрдбрд┐рд╢рдирд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд┐рдЯреЗрд▓реНрд╕"ред
рдлрд┐рд░ рдореБрдЦреНрдп рдкреГрд╖реНрда (App1.MainPage рдХреНрд▓рд╛рд╕) рдореЗрдВ рдХреБрдЫ рдмрдЯрди рдЬреЛрдбрд╝реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, XAML рдкреЗрдЬ рдлрд╝рд╛рдЗрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА

 <Page x:Class="App1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <Button Name="SR" Margin="167,262,0,406" Height="100" Width="300" Content="Press to run Simple Reduction"></Button> <Button Name="DR" Margin="559,262,0,406" Height="100" Width="300" Content="Press to run Deterministic Reduction"></Button> </Grid> </Page> 


рд╡реИрд╕реЗ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рдореЗрдВ рдЧрдбрд╝рдмрдбрд╝ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЕрдзрд┐рдХрд╛рд░ рдФрд░ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдмрдЯрди рджрдмрд╛рдП рдЧрдП рд╣реИрдВ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЧрд┐рд░рддрд╛ рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рд╣рдо рдЯреАрдмреАрдмреА рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрдЯрди рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдореА рдПрд▓реНрдЧреЛрд░рд┐рджрдо (tbb :: parallel_reduce) рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрдореА рд▓реЗрддреЗ рд╣реИрдВ (tbb :: parallel_deterministic_reduce) рдФрд░ MainPage.xaml.cpp рдХреЛ рдореБрдЦреНрдп рдкреГрд╖реНрда рдХреЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 #include "tbb/tbb.h" void App1::MainPage::SR_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { int N=1000000; float fr = 1.0f/(float)N; float sum = tbb::parallel_reduce( tbb::blocked_range<int>(0,N), 0.0f, [=](const tbb::blocked_range<int>& r, float sum)->float { for( int i=r.begin(); i!=r.end(); ++i ) sum += fr; return sum; }, []( float x, float y )->float { return x+y; } ); SR->Content="Press to run Simple Reduction\nThe result is " + sum.ToString(); } void App1::MainPage::DR_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { int N=1000000; float fr = 1.0f/(float)N; float sum = tbb::parallel_deterministic_reduce( tbb::blocked_range<int>(0,N), 0.0f, [=](const tbb::blocked_range<int>& r, float sum)->float { for( int i=r.begin(); i!=r.end(); ++i ) sum += fr; return sum; }, []( float x, float y )->float { return x+y; } ); DR->Content="Press to run Deterministic Reduction\nThe result is " + sum.ToString(); } 

рдФрд░ рдореБрдЦреНрдп рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП XAML рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА
 <Page x:Class="App1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <Button Name="SR" Margin="167,262,0,406" Height="100" Width="300" Content="Press to run Simple Reduction" Click="SR_Click"></Button> <Button Name="DR" Margin="559,262,0,406" Height="100" Width="300" Content="Press to run Deterministic Reduction" Click="DR_Click"></Button> </Grid> </Page> 


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдВрдЯреЗрдирд░ рдореЗрдВ tbb.dll рдФрд░ tbbmalloc.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ - рдореМрдЬреВрджрд╛ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝реЗрдВ) рдФрд░ "рдХрдВрдЯреЗрдВрдЯ" рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ "рдпрд╕" рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рдХрдВрдЯреЗрдирд░ (AppX) рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрд╡реЗрджрди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдФрд░ рдмрд╛рдж рдореЗрдВ рджреЛрдиреЛрдВ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣реЛ рдЧрдпрд╛ред рдЖрдк рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рдЕрдЧрд▓рд╛ рдХрджрдо "рд╡рд┐рдВрдбреЛрдЬ рдРрдк рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХрд┐рдЯ" рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ:


рд╡рд╣ рд╕рдм рд╣реИ! рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм рдЖрдк рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

рдбрд╛рдЙрдирд▓реЛрдб рдЗрдВрдЯреЗрд▓ рдереНрд░реЗрдбрд┐рдВрдЧ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдУрдкрди рд╕реЛрд░реНрд╕ рд╕рдВрд╕реНрдХрд░рдг):
threadingbuildingblocks.org
рдЗрдВрдЯреЗрд▓ рдЯреАрдмреАрдмреА рдХрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг (рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ):
software.intel.com/en-us/intel-tbb

рдЗрдВрдЯреЗрд▓ рдЯреАрдмреАрдмреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рдФрд░ рд░реВрд╕реА рдмреНрд▓реЙрдЧ
software.intel.com/en-us/tags/17207
software.intel.com/en-us/tags/17220
рдФрд░, рдмреЗрд╢рдХ, рд╣рдорд╛рд░реЗ рдордВрдЪ,
software.intel.com/en-us/forums/intel-threading-building-blocks

Source: https://habr.com/ru/post/In158263/


All Articles