Просматривая веб-страницу руководства TBB: https://www.intel.com/content/www/us/en ... inity.html, они упоминают этот affinity_partitioner, который должен помочь перераспределить те же самые единицы работы, которые уже использовались (и, возможно, все еще находятся в кеше) заданным поток в тот же поток, если данные повторно используются в другом цикле (так я это понял).
Они упоминают, что график, показывающий увеличение скорости (до 16x по отношению к auto_partitioner), был для простого расчета a += b с изменяющимся размером вектора.
Я не смог воспроизвести это вообще (не получив разницы между двумя разделителями), компилируя с помощью Visual Studio в режиме Release следующий код. Есть ли способ показать четкую разницу (даже на другом примере)?
#include
#include
#include
#include
#include
#include
using namespace oneapi;
using std::size_t;
template
void parallel_compute(bool parallel, size_t size, unsigned steps, Partitioner partitioner = tbb::auto_partitioner{})
{
std::vector x(size, 1.0);
std::vector y(size);
const auto t0{std::chrono::high_resolution_clock::now()};
for (auto t{0u}; t < steps; ++t)
{
if (parallel)
{
tbb::parallel_for(
tbb::blocked_range{0, size},
[&](const tbb::blocked_range& range)
{
for (auto i{range.begin()}; i != range.end(); ++i) y += x;
},
partitioner);
}
else
{
for (size_t i{0}; i != size; ++i) y += x;
}
}
const auto t1{std::chrono::high_resolution_clock::now()};
const auto seconds{std::chrono::duration(t1 - t0).count()};
std::println("Result: {}, Size: {}, Time: {}s, Parallel: {}", y[0], size, seconds, parallel);
}
// TODO: show an actual difference between the two partitioners
auto main() -> int
{
while (true)
{
for (size_t size{1000}; size
Подробнее здесь: https://stackoverflow.com/questions/798 ... le-speedup