Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.12.205] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Тут уже мне сложно сказать, я с этой штукой тоже работать не умею.
На самом деле, эта задача легко решается с помощью обычных потоков. Примерно так #include <thread> #include <chrono> #include <iostream> static const size_t _sz = 1024 * 1024; static double a[_sz]; static double b[_sz]; static double c[_sz] = {0}; void CalcSum(size_t n, const double *a, const double *b, double *res) { //printf("%s, %lu\n", __FUNCTION__, n); for (size_t i = 0; i < 1000; ++i) { for (size_t i = 0; i < n; ++i) res[i] = sqrt(pow(a[i], 2) + pow(b[i], 2)); } } void TestCalc() { for (size_t i = 0; i < _sz; ++i) { a[i] = i; b[i] = i; } auto tm = std::chrono::steady_clock::now(); CalcSum(_sz, a, b, c); auto tm2 = std::chrono::steady_clock::now(); std::cout << "Time sync: " << std::chrono::duration_cast<std::chrono::milliseconds>(tm2 - tm).count() << std::endl; static const auto _procs = std::thread::hardware_concurrency(); std::cout << "Processors: " << _procs << std::endl; static const size_t _block = _sz / _procs; std::list<std::thread> threads; tm = std::chrono::steady_clock::now(); size_t offset = 0; for (size_t i = 0; i < _procs; ++i, offset += _block) threads.emplace_back(&CalcSum, _block, a + offset, b + offset, c + offset); if (offset < _sz) CalcSum(_sz - offset, a + offset, b + offset, c + offset); for (auto &thread: threads) thread.join(); tm2 = std::chrono::steady_clock::now(); std::cout << "Time async: " << std::chrono::duration_cast<std::chrono::milliseconds>(tm2 - tm).count() << std::endl; } |
Сообщ.
#17
,
|
|
|
Спасибо за код с потоками, он поможет при изучении потоков. А с этим примером даже не знаю, где можно проконсультироваться. Специализированных форумов я не нашел в интернете
|
Сообщ.
#18
,
|
|
|
Добрый день!
Дело в типе double. Прежде чем использовать этот тип, надо проверять, поддерживает ли его Ваша видеокарта. Это делается с использованием свойства supports_limited_double_precision у объекта accelerator – что-нить типа: accelerator defaultAccelerator; if (defaultAccelerator.supports_limited_double_precision) { … } Если не поддерживает, используйте float. |
Сообщ.
#19
,
|
|
|
Спасибо, Павел 77. Попробую.
|