Windows* 8 OS: Написание многопоточных приложений для магазина Windows* с помощью Intel® Threading Building Blocks - теперь c DLL.

Эта статья описывает, как построить простое приложение для магазина Windows используя Intel® Threading Building Blocks (Intel® TBB).

Мой предыдущий пост  “Windows* 8 Tutorial: Writing a Multithreaded Application for the Windows Store* using Intel® Threading Building Blocks” описывает экспериментальную поддержку для приложений для магазина Windows. Обновление 3 для Intel TBB 4.1, так же как стабильный релиз tbb41_20130314oss содержит динамические библиотеки для таких приложений.

Для создания простого приложения создайте новый проект Blank App (XAML), используя шаблон Visual C++Windows Store.  В статье используется имя проекта tbbSample0321

Добавьте пару кнопок для основную страницу (tbbSample0321.MainPage class). После этого добавления XAML-файл страницы будет выглядеть примерно так

<Page
    x:Class="tbbSample0321.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:tbbSample0321"
    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 Determenistic Reduction" Click="DR_Click"></Button>   
     </Grid>
</Page>

И добавьте в заголовочный файл основной страницы  (MainPage.xaml.h) объявления методов обработки нажатия на кнопки:

#pragma once
#include "MainPage.g.h"
namespace tbbSample0321
{
 public ref class MainPage sealed
 {
 public:
 MainPage();
 protected:
 virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override;
 private:
 void SR_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
 void DR_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); 
 };

Затем добавьте вызовы функций библиотеки Intel TBB в в эти обработчики событий. Как пример, используйте алгоритмы редукции (tbb::parallel_reduce) и детерминистической редукции (tbb::parallel_deterministic_reduce).  Для этого добавьте следующий код в основной исходний главной страницы MainPage.xaml.cpp: 

#include "tbb/tbb.h"
void tbbSample0321::MainPage::SR_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    int N=100000000;
    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 ReductionnThe answer is " + sum.ToString();
}


void tbbSample0321::MainPage::DR_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    int N=100000000;
    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 ReductionnThe answer is " + sum.ToString();
}




Затем сконфигурируйте Intel TBB в странице свойств проекта

В Visual Studio, Project > Properties > Intel Performance Libraries, установите Use TBB в Yes:

Если Вы используете стабильный релиз, то сконфигурируйте проект вручную: добавьте папку <TBB_folder>/include в свойства проекта Additional Include Directories и добавьте каталог, где лежит библиотека tbb.lib в Additional Library Directories.  

Затем добавьте динамические библиотеки tbb.dll и tbbmalloc.dll в контейнер приложения. Для этого добавьте файлы в проект через Project> Add Existing Item… 

и установите свойство Content в Yes. В этом случае файлы будут скопированы в контейнер приложения (AppX) и затем могут быть загружены во время старта приложения или позже.

Вот и всё! Простое приложение для магазина Windows готово и это должно быть хорошим стартом для написания более сложных многопоточных приложений используя Intel® Threading Building Blocks.

*Другие наименования и товарные знаки являются собственностью своих законных владельцев.