From 2c57b0ed4ce856419f94e6eb9c4c37e4ec4dd66e Mon Sep 17 00:00:00 2001 From: Helge Norberg Date: Mon, 23 Nov 2015 19:11:24 +0100 Subject: [PATCH] Improved performance in flash producer --- common/CMakeLists.txt | 3 ++ common/memcpy.h | 42 +++++++++++++++++++++++ common/memset.h | 42 +++++++++++++++++++++++ modules/flash/producer/flash_producer.cpp | 8 ++--- 4 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 common/memcpy.h create mode 100644 common/memset.h diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 3705885c2..a4bc89b88 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -74,6 +74,8 @@ set(HEADERS lock.h log.h memory.h + memcpy.h + memset.h memshfl.h param.h polling_filesystem_monitor.h @@ -91,6 +93,7 @@ add_library(common ${SOURCES} ${HEADERS} ${OS_SPECIFIC_SOURCES}) add_precompiled_header(common stdafx.h FORCEINCLUDE) include_directories(..) +include_directories(${ASMLIB_INCLUDE_PATH}) include_directories(${BOOST_INCLUDE_PATH}) include_directories(${RXCPP_INCLUDE_PATH}) include_directories(${TBB_INCLUDE_PATH}) diff --git a/common/memcpy.h b/common/memcpy.h new file mode 100644 index 000000000..530f6172b --- /dev/null +++ b/common/memcpy.h @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2011 Sveriges Television AB +* +* This file is part of CasparCG (www.casparcg.com). +* +* CasparCG is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* CasparCG is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with CasparCG. If not, see . +* +* Author: Helge Norberg, helge.norberg@svt.se +*/ + +#pragma once + +#include + +#include + +namespace caspar { + +static void fast_memcpy(void* dest, const void* src, std::size_t size) +{ + tbb::affinity_partitioner partitioner; + tbb::parallel_for(tbb::blocked_range(0, size, size / 128), [&](const tbb::blocked_range& range) + { + A_memcpy( + reinterpret_cast(dest) + range.begin(), + reinterpret_cast(src) + range.begin(), + range.size()); + }, partitioner); +} + +} diff --git a/common/memset.h b/common/memset.h new file mode 100644 index 000000000..a53b0b2d4 --- /dev/null +++ b/common/memset.h @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2011 Sveriges Television AB +* +* This file is part of CasparCG (www.casparcg.com). +* +* CasparCG is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* CasparCG is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with CasparCG. If not, see . +* +* Author: Helge Norberg, helge.norberg@svt.se +*/ + +#pragma once + +#include + +#include + +namespace caspar { + +static void fast_memset(void* dest, int c, std::size_t size) +{ + tbb::affinity_partitioner partitioner; + tbb::parallel_for(tbb::blocked_range(0, size, size / 128), [&](const tbb::blocked_range& range) + { + A_memset( + reinterpret_cast(dest) + range.begin(), + c, + range.size()); + }, partitioner); +} + +} diff --git a/modules/flash/producer/flash_producer.cpp b/modules/flash/producer/flash_producer.cpp index 4066ecea9..8cefe4d4c 100644 --- a/modules/flash/producer/flash_producer.cpp +++ b/modules/flash/producer/flash_producer.cpp @@ -49,6 +49,8 @@ #include #include #include +#include +#include #include #include @@ -58,8 +60,6 @@ #include -#include - #include namespace caspar { namespace flash { @@ -299,10 +299,10 @@ public: desc.planes.push_back(core::pixel_format_desc::plane(width_, height_, 4)); auto frame = frame_factory_->create_frame(this, desc, core::audio_channel_layout::invalid()); - A_memset(bmp_.data(), 0, width_ * height_ * 4); + fast_memset(bmp_.data(), 0, width_ * height_ * 4); ax_->DrawControl(bmp_); - A_memcpy(frame.image_data(0).begin(), bmp_.data(), width_*height_*4); + fast_memcpy(frame.image_data(0).begin(), bmp_.data(), width_*height_*4); head_ = core::draw_frame(std::move(frame)); } -- 2.39.2