42 #include <visp3/core/vpConfig.h>
44 #if defined(VISP_HAVE_PTHREAD) || (defined(_WIN32) && !defined(WINRT_8_0))
50 #include <visp3/core/vpColVector.h>
51 #include <visp3/core/vpIoTools.h>
52 #include <visp3/core/vpThread.h>
61 : m_add(), m_mul(), m_v1(v1), m_v2(v2), m_indexStart(start), m_indexEnd(end)
64 vpArithmFunctor() : m_add(), m_mul(), m_v1(), m_v2(), m_indexStart(0), m_indexEnd(0) { }
66 void operator()() { computeImpl(); }
77 unsigned int m_indexStart;
78 unsigned int m_indexEnd;
82 m_add.
resize(m_indexEnd - m_indexStart);
83 m_mul.
resize(m_indexEnd - m_indexStart);
86 for (
int iter = 0; iter < 100; iter++) {
87 for (
unsigned int i = m_indexStart, cpt = 0; i < m_indexEnd; i++, cpt++) {
88 m_add[cpt] = m_v1[i] + m_v2[i];
89 m_mul[cpt] = m_v1[i] * m_v2[i];
99 vpArithmFunctor *f =
static_cast<vpArithmFunctor *
>(args);
107 unsigned int size = v1.
size();
110 for (
unsigned int i = 0, cpt = size; i < v2.
size(); i++, cpt++) {
117 double add = 0.0, mul = 0.0;
118 for (
unsigned int i = 0; i < v1.
size(); i++) {
119 add += v1[i] + v2[i];
120 mul += v1[i] * v2[i];
123 double add_th = res_add.
sum();
124 double mul_th = res_mul.
sum();
126 std::cout <<
"add=" << add <<
" ; add_th=" << add_th << std::endl;
127 std::cout <<
"mul=" << mul <<
" ; mul_th=" << mul_th << std::endl;
129 if (!
vpMath::equal(add, add_th, std::numeric_limits<double>::epsilon())) {
130 std::cerr <<
"Problem: add=" << add <<
" ; add_th=" << add_th << std::endl;
134 if (!
vpMath::equal(mul, mul_th, std::numeric_limits<double>::epsilon())) {
135 std::cerr <<
"Problem: mul=" << mul <<
" ; mul_th=" << mul_th << std::endl;
145 unsigned int nb_threads = 4;
146 unsigned int size = 1000007;
147 srand((
unsigned int)time(
nullptr));
150 for (
unsigned int i = 0; i < size; i++) {
151 v1[i] = rand() % 101;
152 v2[i] = rand() % 101;
156 std::vector<vpThread> threads(nb_threads);
157 std::vector<vpArithmFunctor> functors(nb_threads);
158 unsigned int split = size / nb_threads;
159 for (
unsigned int i = 0; i < nb_threads; i++) {
160 if (i < nb_threads - 1) {
161 functors[i] = vpArithmFunctor(v1, v2, i * split, (i + 1) * split);
164 functors[i] = vpArithmFunctor(v1, v2, i * split, size);
167 std::cout <<
"Create thread: " << i << std::endl;
174 for (
size_t i = 0; i < nb_threads; i++) {
175 std::cout <<
"Join thread: " << i << std::endl;
178 insert(res_add, functors[i].getVectorAdd());
179 insert(res_mul, functors[i].getVectorMul());
183 if (!check(v1, v2, res_add, res_mul)) {
187 std::cout <<
"testThread2 is ok!" << std::endl;
198 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
199 std::cout <<
"You should enable pthread usage and rebuild ViSP..." << std::endl;
201 std::cout <<
"Multi-threading seems not supported on this platform" << std::endl;
static void insert(const vpArray2D< Type > &A, const vpArray2D< Type > &B, vpArray2D< Type > &C, unsigned int r, unsigned int c)
unsigned int size() const
Return the number of elements of the 2D array.
Implementation of column vector and the associated operations.
void resize(unsigned int i, bool flagNullify=true)
static bool equal(double x, double y, double threshold=0.001)