Вопросы с тегами [parallel-processing]

1

голосов
0

ответ
711

Просмотры

GPU ->CPU Memcpy failed in tensorflow word2vec in gpu occured

II уча word2v из tensorflow. Мы купили два 1080i для параллельной обработки ГПА. Монтаж был успешным и p2p был успешным. Тем не менее, я попытался присвоить его GPU с помощью команды с tf.device ( '/ GPU: 0') Следующая ошибка: Я tensorflow / ядро ​​/ common_runtime / GPU / gpu_device.cc: 885] Найдено устройства 1 со свойствами: название: GeForce GTX 1080 Ti основных: 6 второстепенный: 1 memoryClockRate (ГГц) 1,645 pciBusID 0000: 66: 00,0 Общий объем памяти: 10.91GiB Свободная память: 10.21GiB tensorflow / ядро ​​/ common_runtime / GPU / gpu_device.cc: 906] DMA: 0 1 tensorflow / ядро ​​/ common_runtime / GPU / gpu_device.cc: 916] 0: ГГ tensorflow / ядро ​​/ common_runtime / GPU / gpu_device.cc: 916] 1: YYI tensorflow / ядро ​​/ common_runtime / GPU / gpu_device.cc: 975] Создание TensorFlow устройство (/ GPU: 0) -> (устройство: 0, имя: GeForce GTX 1080 Ti, шины PCI ID: 0000: 65: 00. 0) Я tensorflow / ядро ​​/ common_runtime / GPU / gpu_device.cc: 975] Создание TensorFlow устройства (/ GPU: 1) -> (устройство: 1, имя: GeForce GTX 1080 Ti, шины PCI ID: 0000: 66: 00,0) Я word2vec_kernels.cc:246] файл данных: / spouse_freebase / input2.nt содержит 34966827 байт, 2620786 слов, 11769 уникальных слова, 11769 уникальных частых слов. Е tensorflow / stream_executor / CUDA / cuda_driver.cc: 1 276] не удался епдиеим асинхронный тетср от устройства к хосту: CUDA_ERROR_INVALID_VALUE; хозяйничать DST: 0x104d5000000; GPU ЦСИ: 0x7f12c800cbc0; Размер: 8 = 0x8 Я tensorflow / stream_executor / stream.cc: +1338] поток 0x39c2160 не ждать, пока поток: 0x39bf9a0 Я tensorflow / stream_executor / stream.cc: 3775] Поток 0x39c2160 не тетсру устройство-хост; Источник: 0x3bd0d00 F tensorflow / ядро ​​/ common_runtime / GPU / gpu_util.cc: 296] GPU-> CPU тетсру не удалось, я думаю, что эта ошибка является из памяти GPU. Я жду вашей помощи. благодарю вас.
홍지훈
1

голосов
0

ответ
158

Просмотры

Как использовать TEMPUS-Fugit в затмении запустить junits параллельно без изменения исходного кода?

На основании информации, содержащейся в следующую ссылку я могу запустить junits параллельно с затмением, добавив @RunWith (ConcurrentTestRunner.class) для моих тестовых классов. https://stackoverflow.com/a/13063715/825707 Но у меня есть унаследованный код с около 400 тестов JUnit классов и около 4000 тестовых случаев. Я не хочу, чтобы обновить 400 Java файлов с @RunWith (ConcurrentTestRunner.class), есть способ, чтобы создать набор или изменения в плагин, так что я могу запустить их все параллельно без изменения моего исходного кода ? Благодаря Шакти
Shakti
2

голосов
0

ответ
498

Просмотры

Параллелизм в ASP.NET и модели процессов идентификации в IIS пула приложений

Я использую параллелизм в ASP.NET 4, в каждой задаче у меня есть подключение к базе данных, в большинстве случаев я получаю исключение: Логин не удался для пользователя: 'IIS AppPool \\ MyAppPool. После некоторого поиска я понял, если я изменить личность Модели процесса в пуле приложений От ApplicationPoolIdentity к LocalSystem каждым вещи будут хорошо. Но почему? Где разница между этими идентичностями? Я нашел Модель процесса настройки для пула приложений, но я не понимаю, что связано с параллельности? Кто-нибудь знает об этом? И есть ли другой способ использовать параллельность и подключиться к базе данных вместо того, чтобы изменить модели процесса идентичности? любое предложение?
Saeid
2

голосов
0

ответ
62

Просмотры

Orient DB MultiCore write side processing

У меня есть большая сторона записи операции я хотел бы закончить с Orient БД на одном классе Vertex. Восточный БД утверждает, выделить процесс для каждого кластера на базе данных https://orientdb.com/docs/last/Tutorial-Clusters.html. Я в настоящее время использую 16 основной машины в пытаться выполнять параллельные операции записи с ~ 15 процессов клиента, запрашивающего пишет, однако я не могу достигнуть использования CPU на OrientDB более 2-х ядер. Кто-нибудь есть какие-либо советы о том, как увеличить количество ядер, используемых в параллельных операций записи в Orient БД? Ниже приведен пример, где функция называется рабочая каждым процесс выдает кучу сориентировать операции записи. max_processes = 15 = процессы [] Защиту increment_token_idx (token_idx): если token_idx == 14: Возвращение 0 еще: вернуть token_idx + 1, а Правда: в то время как LEN (процессы) <max_processes:
crawfobw
3

голосов
0

ответ
96

Просмотры

OpenMP для цикла планирования визуализации фрагмента

Есть инструменты, которые визуализируют выполнение OpenMP для цикла кусков? Например, рассмотрим параллельно для цикла ниже: #pragma OMP параллельно для графика (динамические, 10) NUM_THREADS (4) для (INT I = 1; я
nandu
2

голосов
0

ответ
101

Просмотры

эффективность GPU распараллеливание

Первоначально я представил эту задачу в качестве основного распараллеливания вопроса, который ответил на @Divakar. Его работа будет служить основой для этого наблюдения. Он предположил, что дальнейшее ускорение может быть достигнуто путем переноса кода для вычисления на GPU вместо этого. Я исследовал этот путь и был в состоянии улучшить векторизованную решение от скорости до 15% в моем случае более итеративных циклов на 50% ускорить. Однако дальнейшие мастерить не привели ко многим другим улучшениям. Мой первый беспокоит то, что оборудование не достаточно, особенно мощный, но прежде, чем наша группа может оправдать тратить деньги на новое оборудование, мы хотели бы видеть больше эффективности из кода на нашей текущей настройки: XGPU = gpuArray (X); YGPU = gpuArray (Y); HGPU = gpuArray (Н); ЕГПУ = gpuArray (Е); % Выполнение Крон формата поэлементное умножение betwen первых двух тускнеет% от Х и Y, сохраняя третью тусклую выровненные и "выталкивание" остатки тускнеют% от Y к задним мультам = bsxfun (@ mtimes, переставляет (XGPU, [4,2,5,1,3]), перестановочен (YGPU, [1,6 , 2,7,3,4,5])); mults3D = переформовать (мульты, N2, N2, []); ясно мультов; Emults3D = Reshape (ЕГП * Reshape (mults3D, размер (mults3D, 1), []), размер (mults3D)); % Трассировка сложения с использованием линейных индексов диагонали на 3D срезах в Emults3D MN = N2; IDX = 1: МН + 1: МН ^ 2; idx2D = bsxfun (@ плюс, IDX (:), МН ^ 2 * (0: размер (Emults3D, 3) -1)); pr_sums = сумма (Emults3D (idx2D), 1); ясно Emults3D; ясно idx2D; % Выполнить "M / Pr" эквивалентные поэлементно деления, а затем использовать% матричного умножения для уменьшения итерационные сложений Мр = bsxfun (@ rdivide, mults3D, изменить форму (pr_sums, 1,1, [])); ясно pr_sums; ясно mults3D; outGPU = Reshape (Мр, [], размер (Мр, 3)) * Reshape (переставить (HGPU, [3,1,2]), [], 1); outGPU = Reshape (outGPU, N2, N2) / (сумма (сумма (сумма (HGPU)))); ясно Mp; из = сбора (outGPU); Некоторая соответствующая информация: X представляет собой массив 3D MxMxN. У является массивом 5D MxNxNxPxP. Н представляет собой 3D построение 2D гистограммы срезов размера MxPxP. E является M ^ 2XM ^ 2 матрицы булевой маски. Расчеты, которые в настоящее время узкие места является создание Emults3D и создание Мр. Мои вопросы заключаются в следующем: Существуют ли более эффективные способы для улучшения распределения памяти GPU ручки? Даже тесты на значительно превосходящие аппаратные средства с 4 ГБ VRAM не полные расчетов по полной шкале и должен быть усечены и поправили. Будет писать CUDA ядра улучшить распараллеливание и ускорить и какие расчеты следует настраивать таргетинг? Какие части этих линий на самом деле медленно: в перекраивают или умножения / деление? В любом случае, есть другие альтернативы, такие Параллельные как pagefun или аналогичная, чтобы сократить время вычислений? Замечу, что когда-то алгоритмы расчета улучшаются, я планирую на использовании gpuArray конструкторов, чтобы удалить как можно больше переводов с принимающей> GPU в начале. Это также будет включать в ожидании, чтобы построить E и H, пока в конце кода так, чтобы они не тратить драгоценное VRAM пространство в начале.
Mike Vandenberg
7

голосов
0

ответ
134

Просмотры

R : Render_site is not working with Dopar

I have a problem with Render_site using the dopar of foreach The code works perfectly using simple for. Whereas I have a problem when using dopar since the ouput is duplicated after using dopar in the YAML file. Note that the dopar works correctly if I use Render instead of Render_site. Below you can see my code : pacman::p_load(data.table) pacman::p_load(data.table,rmarkdown) pacman::p_load(rmarkdown,knitr,kableExtra,dplyr) info.rmd=readLines("test.rmd",encoding = "UTF-8") yml=readLines("site.yml",encoding = "UTF-8") fun
Geek
2

голосов
0

ответ
56

Просмотры

Почему параллельно Еогеасп странно медленно с решить?

Я пытался улучшить эффективность моего кода с помощью параллельного цикла Еогеаспа из библиотеки doParralel. Тем не менее, я обнаружил, что она занимает значительно большее количество времени для параллельного кода завершения. Мне удалось сузить проблему к линиям оптимизирующей (nloptr) функция с участием матрицы инверсии. Может кто-нибудь помочь мне выяснить, почему я получаю следующие результаты? Это точный сценарий, я использую, чтобы воспроизвести библиотеку проблемы (doParallel) если {сл sessionInfo () R версия 3.2.3 (2015-12-10) Платформа (существует ( 'кластер')!): X86_64-рс-linux- ГНУ (64-битный) Запуск под: Ubuntu 16.04.4 LTS местности: [1] LC_CTYPE = en_GB.UTF-8 LC_NUMERIC = С [3] LC_TIME = pl_PL.UTF-8 LC_COLLATE = en_GB.UTF-8 [5] LC_MONETARY = pl_PL.UTF-8 LC_MESSAGES = en_GB.UTF-8 [7] LC_PAPER = pl_PL.
Domin
3

голосов
0

ответ
421

Просмотры

Параллельный вариант дает разные результаты

Это связанно с моим предыдущим вопросом mclapply против для петель для черчения: скорость и расширяемость фокус, я думаю, что теперь у меня есть три / четыре способа сделать то же самое, но получить разные результаты, даже при установке случайных семян. Во-первых ... почему результаты разные ... Есть results2 и results3 по сути делает то же самое? Хотя это и не показано в первом примере (показано ниже) ... Есть моменты, которые results2 занимает больше времени, чем когда не используется .parrallel = TRUE, вариант, почему? > гт (список = Ls ())> дс () используется (Мб) триггер дс (Мб) макс (МБ) Ncells 253264 13,6 1801024 96,2 1643320 87,8 Vcells 829208 6,4 22407472 171,0 28009341 213,7> требуется (ggplot2) Загрузка требуется пакет: ggplot2> требуется (plyr) Загрузка требуется пакет: plyr> требуется (Еогеасп) Загрузка требуемого пакета: Еогеасп Еогеасп: простой, масштабируемое параллельное программирование от Revolution Analytics использования Revolution R для обеспечения масштабируемости, отказоустойчивости и многое другое. http://www.revolutionanalytics.com> требуется (DoMC) Загрузка требуется пакет: DoMC Загрузка требуется пакет: итераторы Загрузка требуемого пакета: многоядерный> registerDoMC (сердечники = 4)> дс () используются (Мб) триггер дс (Мб) макс используется (Мб) Ncells 409261 21,9 1440819 77,0 1643320 87,8 1039134 Vcells 8.0 17925977 28009341 136,8 213,7> DF PARAMS ФФ
h.l.m
2

голосов
0

ответ
45

Просмотры

OpenACC результат меняется с размером

Я пытаюсь распараллеливание кода C ++, которые используют несколько массивов с одинаковым размером. У меня есть «версия хоста» Wich не параллелен и «Прагма версия», которая содержит прагмы. С небольшими размерами, значения обеих версий (хоста и Pragma) являются одинаковыми. Но с большим размером, значения действительно отличаются. Результат работы алгоритма должен сходиться, и это не тот случай версии прагмы. Вы идея о причине? Спасибо
sébastien
2

голосов
0

ответ
342

Просмотры

Pathos, Даск, фьючерсы, который использовать для параллельного применения кластера?

Я смущен здесь. У меня есть приложение, которое CPU ограниченно, поэтому я пошел к реализации параллелизма с использованием многопроцессорного для преодоления проблем Gil. Я первый попытался использовать мультипроцессирование и фьючерсы, но я столкнулся с вопросом травильного поэтому я пошел в пафос, который использует укроп в качестве замены маринада. Все работает, но мне интересно, если я использую наиболее решение «будущее доказательство». Я видел также Даск, но я не знаю, если он будет работать в случае проблем классов травления (см Python: (пафос) Multiprocessing против методов класса). Из дока, он использует фьючерсы, так что я предполагаю, что это не будет делать эту работу. Во-вторых, я хотел бы иметь возможность использовать два сервера в то время, и я видел, что это возможно с пафосом (также ДАСК), но я не понимаю, как именно это работает. Этот ответ https: // StackOverflow. ком / а / 26948258/6522112 только показывает, как использовать один сервер. Как об использовании 2 или более? Я не могу найти ни одного примера о том, что, хотя это представляется возможным, как описано в информации пакета. Спасибо за вашу помощь!
Y0da
3

голосов
0

ответ
131

Просмотры

Можно ли parallelise asp.net прекомпиляции

Я знаю, что MSBuild поддерживает параллелизм, но это, кажется, aspnet_compiler не делает. Существуют ли какие-либо инструменты сторонних производителей, которые делают?
Myles McDonnell
3

голосов
0

ответ
795

Просмотры

Properly lock a multiprocessing.Pool over an iterator without memory overhead

У меня есть Iterable объект питона Z, который в большой, чтобы поместиться в память. Я хотел бы выполнить параллельное вычисление над этим объектом и записать результаты, чтобы они появляются в Z, в файл. Рассмотрим этот глупый пример: импорт NumPy в н.п. импорт многопроцессорной как тр импорт itertools как ITR FOUT = открытый ( «тест», «ш») четкости F (х): валь = хэш (np.random.random ()) FOUT.write ( "% s \ п" % Val) N = 10 ** 9 Z = itr.repeat (0, N), Р = mp.Pool () P.map (е, Z, chunksize = 50) P.close () P.join () FOUT.close () Есть две основные проблемы, связанные с этим: множественные результаты могут быть записаны в той же строке, результат возвращается с N объектов в нем - это будет большим, чтобы держать в памяти (и мы не «т нужно!). То, что я пытался: Используя глобальную блокировку mp.Lock (), чтобы разделить ресурс FOUT: не помогает, потому что я думаю, что каждый работник создает свое собственное пространство имен. Используйте apply_async вместо карты: В то время как имеющие обратный вызов устанавливает 1], 2], он не принимает итератор объекта. Использование IMAP вместо карты и итерация по результатам: Что-то вроде: четкости F (х): Val = хэш (np.random.random ()) возвращают VAL P = mp.Pool () С = P.imap (F, Z , chunksize = 50) для й в C: FOUT.write ( «% s \ п»% х) Это по-прежнему использует чрезмерное количество памяти, хотя я не знаю, почему.
Hooked
2

голосов
0

ответ
262

Просмотры

Анаконда R, казалось бы, не может использовать OpenBLAS. Только MKL? Зачем?

Главный вопрос (# 1): Есть ли секрет трюк, чтобы получить анаконду R, в частности, (а не другой R пожалуйста, нет никаких проблем с другими R) использовать подсистему BLAS резидентной на Ubuntu? Другие численные приложения (октава) на одном хосте демонстрируют установки подсистемы BLAS действительна и высокая производительность, как и ожидалось для численных матричных операций в зависимости от значения переменной среды OMP_NUM_THREADS. Никакой специальный трюк не был нужен для подключения этого не-анаконда программного обеспечения в подсистему резидентов Бласа. Связанный вопрос (# 2): Распространяется подсистема Intel MKL BLAS с анакондой и возможностью быть использованы анакондами R, в качестве запасного варианта от OpenBLAS? В этом случае, как активировать MKL BLAS? Программа HTOP показывает одноядерный 100% утилизации только на Анаконда R во время контрольного прогона. Неожиданно оказалось, Анаконда R не может использовать OpenBLAS для параллельного кода матрицы. Резкое замедление> 40x наблюдается в сравнении с эталонной машины, используя обычный R не анаконды R. Это недопустимая проблема производительности. Сама установка Блас подсистема была подтверждена, как правильно и полностью функциональным использованием пакета GNU Octave, запустив числовой тест, показывающий отличное улучшение, как ожидалось, когда OMP_NUM_THREADS = 1 был изменен на OMP_NUM_THREADS = 16, что соответствующее значение для испытательного оборудования. Заключительный вопрос (# 3): Является ли анаконда сопровождающий поставщик намеренно строит R двоичный файл для использования с Intel MKL, исключая подсистемы OpenBLAS? Спасибо за прочтение. Запрос любые ответы ограничиваются людьми с опытом фактического использования MKS или OpenBLAS успешно только анаконда пакетов программного обеспечения. Спасибо за понимание. Не стесняйтесь использовать мой ориентир: # Plain старые R, OpenBLAS, OMP_NUM_THREADS = 4,
Geoffrey Anderson
2

голосов
0

ответ
353

Просмотры

TensorFlow На Спарк: Не удается замариновать локальный контур объекта

У меня есть Standalone Спарк кластера и попробуйте запустить TensorFlow искровые на нем с помощью Python. До сих пор, я просто попытался очень простые примеры, но я всегда работать в одной и той же проблемой: каждый рабочий разбивает с тем же сообщением об ошибке: AttributeError: Не удается замариновать локальный объект «старт ..» Новый работник назначается и я в конечном счете, застрял в бесконечном ожидании для оговорок ... цикла. Там нет явного травления в моей программе, так что я предполагаю, что это должно быть частью TensorFlow искрового трубопровода. Без искры обертка мои TensorFlow приложения работают нормально. Я испытал это как на Windows 7 и CentOS Linux 7 с таким же поведением. (Почти) полный вывод ошибок заключается в следующем: 17/08/15 16:40:36 ОШИБКИ Исполнитель: Исключение в задаче 0.2 в стадии 0,0 (TID 5) org.apache.spark.api.python.PythonException: Traceback (наиболее недавний призыв последнего): executor.Executor $ TaskRunner.run (Executor.scala: 335) в java.util.concurrent.ThreadPoolExecutor.runWorker (Unknown Source) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (Unknown Source) в java.lang.Thread .run (Unknown Source) Traceback (самый последний вызов последнего): Файл "", строка 1, в файле "C: \ Program Files \ Anaconda3 \ Lib \ многопроцессорная \ spawn.py", строка 105, в spawn_main ExitCode = _main ( FD) Файл "C: \ Program Files \ Anaconda3 \ Lib \ многопроцессорная \ spawn.py", строка 115, в _Главных себя = reduction.pickle.load (from_parent) Похоже, что эта проблема известна, но никакое решения не существует. Любой намек будет иметь в виду, так как я из идей. ThreadPoolExecutor $ Worker.run (Unknown Source) на java.lang.Thread.run (Unknown Source) Traceback (самый последний вызов последнего): Файл "", строка 1, в файле «C: \ Program Files \ Anaconda3 \ Lib \ многопроцессорная \ spawn.py», строка 105, в spawn_main ExitCode = _Главных (Fd) Файл "C: \ Program Files \ Anaconda3 \ Lib \ многопроцессорная \ spawn.py", линия 115, в _Главных себя = reduction.pickle.load (from_parent ) Похоже, что эта проблема известна, но никакого решения не существует. Любой намек будет иметь в виду, так как я из идей. ThreadPoolExecutor $ Worker.run (Unknown Source) на java.lang.Thread.run (Unknown Source) Traceback (самый последний вызов последнего): Файл "", строка 1, в файле «C: \ Program Files \ Anaconda3 \ Lib \ многопроцессорная \ spawn.py», строка 105, в spawn_main ExitCode = _Главных (Fd) Файл "C: \ Program Files \ Anaconda3 \ Lib \ многопроцессорная \ spawn.py", линия 115, в _Главных себя = reduction.pickle.load (from_parent ) Похоже, что эта проблема известна, но никакого решения не существует. Любой намек будет иметь в виду, так как я из идей.
2

голосов
0

ответ
42

Просмотры

Понимание результат parBuffer на основе стратегии запуска

Я хочу понять, Haskell стратегии оценки, и нашел понятие parBuffer очень интересно. Так что я создал немую медленную функцию, которая вычисляет факториал, и попытался создать параллельную версию. Рассмотрим приведенный ниже код модуля Main, где импорт System.Environment импорта Control.Parallel.Strategies фак :: Int -> Int фак н | п Int facsum п = сумма $ Карта FAC [1..n] facsum_par :: Int -> Int facsum_par п = сумма LST где LST = (карта FAC [1..n]) `using` parBuffer 50 rseq главная :: IO () основные = сделать арг
muffel
2

голосов
0

ответ
153

Просмотры

Запись в файл HDF5 параллельно с использованием отрывов в фортраном

Проблема: У меня есть куски 2D массива разбросаны между несколькими процессорами. Представьте себе, что массив определяется как DOUBLE PRECISION :: F_TOTAL (n1: n2, m1: m2) Теперь каждый процессоров имеет массив DOUBLE PRECISION :: F (n1: n2, mystart: myend) В конце концов, я хочу иметь F_TOTAL хранить в файле HDF5. Решение: Это, кажется, хорошее место, чтобы использовать Hyperslabs. Однако caveate является то, что в то время как все процессоры имеют одинаковые n1 и n2 mystart и myend различны. В частности, второй размер каждого процессоров F является уникальным (но всегда> 0). Мой сбоями Код SUBROUTINE write_parhdf5 (n1, n2, m1, m2, mystart, myend, Farr, var_name, Прдч) ИСПОЛЬЗОВАТЬ mpi_params ИСПОЛЬЗОВАТЬ hdf5 IMPLICIT NONE INTEGER :: n1, n2, m1, m2, mystart, myend, Прдч DOUBLE PRECISION :: Farr (n1: n2, mystart: myend) CHARACTER (LEN = *), INTENT (в) :: var_name INCLUDE 'mpif.h' INTEGER: : МЭО, информация, рейтинг INTEGER (HID_T) :: file_id, fspace_id, dset_id, mspace_id, и fapl_id, dcpl_id, dxpl_id, driver_id INTEGER (HSIZE_T), ALLOCATABLE :: dimsf (:), отсчеты (:), chunk_dims (:) , и смещение (! :) ------- Begin ИОС = подпрограммы 0 = данные MPI_INFO_NULL! Инициализировать ВЫЗОВ h5open_f (ИОС)! Настройка файла ВЫЗОВ доступа h5pcreate_f (H5P_FILE_ACCESS_F, fapl_id, МЭО) ВЫЗОВ h5pset_fapl_mpio_f (fapl_id, Прдч, информация, МЭО) ВЫЗОВ h5pget_driver_f (fapl_id, driver_id, МЭО)! Открыть файл ВЫЗОВ h5fopen_f ( 'file.h5', H5F_ACC_RDWR_F, file_id, МЭО, access_prp = fapl_id)! Установка Helper Массивы ранга = 2; ALLOCATE (dimsf (ранг), chunk_dims (ранг), подсчитывает (ранг), смещение (ранг)) dimsf (1) = n2-n1 + 1 dimsf (2) = m2-m1 + 1 chunk_dims (1) = РАЗМЕР (Фарр , 1) chunk_dims (2) = РАЗМЕР (Фарр, 2) подсчет (1) = 1 отсчетов (2) = 1 смещение (1) = 0 смещение (2) = mystart-1! Создание пространства ЗВОНИТЕ h5screate_simple_f (ранг, dimsf, fspace_id, ИОС) ЗВ h5screate_simple_f (ранг, dimsf, mspace_id, МЭО)! Включение Чанкинг ВЫЗОВ h5pcreate_f (H5P_DATASET_CREATE_F, dcpl_id, ИОС) ЗВ h5pset_chunk_f (dcpl_id, звание, chunk_dims, МЭО)! Создание Dataset ВЫЗОВ h5dcreate_f (file_id, TRIM (var_name), H5T_NATIVE_DOUBLE, fspace_id, dset_id, МЭО, dcpl_id)! Выберите Hyperslab в памяти ВЫЗОВА h5sselect_hyperslab_f (mspace_id, H5S_SELECT_SET_F, офсетная, chunk_dims, МЭО)! Выберите Hyperslab в файле ВЫЗОВА h5sselect_hyperslab_f (fspace_id, H5S_SELECT_SET_F, офсетная, chunk_dims, МЭО)! Создание свойств вызова h5pcreate_f (H5P_DATASET_XFER_F, dxpl_id, МЭО) ВЫЗОВ h5pset_dxpl_mpio_f (dxpl_id, H5FD_MPIO_COLLECTIVE_F, МЭО)! Написать набор данных ЗВ h5dwrite_f (dset_id, H5T_NATIVE_DOUBLE, Farr, dimsf, МЭО, mem_space_id = mspace_id, file_space_id = fspace_id, xfer_prp = dxpl_id)! Закрыть недвижимости список ВЫЗОВ h5pclose_f (fapl_id, МЭО) ВЫЗОВ h5pclose_f (dcpl_id, МЭО) ВЫЗОВ h5pclose_f (dxpl_id, МЭО) ВЫЗОВ h5sclose_f (mspace_id, МЭО) ВЫЗОВ h5sclose_f (fspace_id, МЭО) ВЫЗОВ h5dclose_f (dset_id, МЭО)! Освобождает Помощники DEALLOCATE (dimsf, chunk_dims, счетчики, смещение)! Закройте файл ВЫЗОВ h5fclose_f (file_id, МЭО)! Закройте Фортран интерфейс ВЫЗОВ h5close_f (МЭО) RETURN END SUBROUTINE write_parhdf5 Проблема, которую я получаю, что, когда я называю эту процедуру я получаю ошибку об ошибке: Неподдерживаемый тип данных передается ADIOI_Count_contiguous_blocks, объединитель = 17 Должна быть обеспечена возможность иметь каждый процессор писать разные размер hyperslab, верно? dimsf, МЭО, mem_space_id = mspace_id, file_space_id = fspace_id, xfer_prp = dxpl_id)! Закрыть недвижимости список ВЫЗОВ h5pclose_f (fapl_id, МЭО) ВЫЗОВ h5pclose_f (dcpl_id, МЭО) ВЫЗОВ h5pclose_f (dxpl_id, МЭО) ВЫЗОВ h5sclose_f (mspace_id, МЭО) ВЫЗОВ h5sclose_f (fspace_id, МЭО) ВЫЗОВ h5dclose_f (dset_id, МЭО)! Освобождает Помощники DEALLOCATE (dimsf, chunk_dims, счетчики, смещение)! Закройте файл ВЫЗОВ h5fclose_f (file_id, МЭО)! Закройте Фортран интерфейс ВЫЗОВ h5close_f (МЭО) RETURN END SUBROUTINE write_parhdf5 Проблема, которую я получаю, что, когда я называю эту процедуру я получаю ошибку об ошибке: Неподдерживаемый тип данных передается ADIOI_Count_contiguous_blocks, объединитель = 17 Должна быть обеспечена возможность иметь каждый процессор писать разные размер hyperslab, верно? dimsf, МЭО, mem_space_id = mspace_id, file_space_id = fspace_id, xfer_prp = dxpl_id)! Закрыть недвижимости список ВЫЗОВ h5pclose_f (fapl_id, МЭО) ВЫЗОВ h5pclose_f (dcpl_id, МЭО) ВЫЗОВ h5pclose_f (dxpl_id, МЭО) ВЫЗОВ h5sclose_f (mspace_id, МЭО) ВЫЗОВ h5sclose_f (fspace_id, МЭО) ВЫЗОВ h5dclose_f (dset_id, МЭО)! Освобождает Помощники DEALLOCATE (dimsf, chunk_dims, счетчики, смещение)! Закройте файл ВЫЗОВ h5fclose_f (file_id, МЭО)! Закройте Фортран интерфейс ВЫЗОВ h5close_f (МЭО) RETURN END SUBROUTINE write_parhdf5 Проблема, которую я получаю, что, когда я называю эту процедуру я получаю ошибку об ошибке: Неподдерживаемый тип данных передается ADIOI_Count_contiguous_blocks, объединитель = 17 Должна быть обеспечена возможность иметь каждый процессор писать разные размер hyperslab, верно? Закрыть недвижимости список ВЫЗОВ h5pclose_f (fapl_id, МЭО) ВЫЗОВ h5pclose_f (dcpl_id, МЭО) ВЫЗОВ h5pclose_f (dxpl_id, МЭО) ВЫЗОВ h5sclose_f (mspace_id, МЭО) ВЫЗОВ h5sclose_f (fspace_id, МЭО) ВЫЗОВ h5dclose_f (dset_id, МЭО)! Освобождает Помощники DEALLOCATE (dimsf, chunk_dims, счетчики, смещение)! Закройте файл ВЫЗОВ h5fclose_f (file_id, МЭО)! Закройте Фортран интерфейс ВЫЗОВ h5close_f (МЭО) RETURN END SUBROUTINE write_parhdf5 Проблема, которую я получаю, что, когда я называю эту процедуру я получаю ошибку об ошибке: Неподдерживаемый тип данных передается ADIOI_Count_contiguous_blocks, объединитель = 17 Должна быть обеспечена возможность иметь каждый процессор писать разные размер hyperslab, верно? Закрыть недвижимости список ВЫЗОВ h5pclose_f (fapl_id, МЭО) ВЫЗОВ h5pclose_f (dcpl_id, МЭО) ВЫЗОВ h5pclose_f (dxpl_id, МЭО) ВЫЗОВ h5sclose_f (mspace_id, МЭО) ВЫЗОВ h5sclose_f (fspace_id, МЭО) ВЫЗОВ h5dclose_f (dset_id, МЭО)! Освобождает Помощники DEALLOCATE (dimsf, chunk_dims, счетчики, смещение)! Закройте файл ВЫЗОВ h5fclose_f (file_id, МЭО)! Закройте Фортран интерфейс ВЫЗОВ h5close_f (МЭО) RETURN END SUBROUTINE write_parhdf5 Проблема, которую я получаю, что, когда я называю эту процедуру я получаю ошибку об ошибке: Неподдерживаемый тип данных передается ADIOI_Count_contiguous_blocks, объединитель = 17 Должна быть обеспечена возможность иметь каждый процессор писать разные размер hyperslab, верно? МЭО) ВЫЗОВ h5dclose_f (dset_id, МЭО)! Освобождает Помощники DEALLOCATE (dimsf, chunk_dims, счетчики, смещение)! Закройте файл ВЫЗОВ h5fclose_f (file_id, МЭО)! Закройте Фортран интерфейс ВЫЗОВ h5close_f (МЭО) RETURN END SUBROUTINE write_parhdf5 Проблема, которую я получаю, что, когда я называю эту процедуру я получаю ошибку об ошибке: Неподдерживаемый тип данных передается ADIOI_Count_contiguous_blocks, объединитель = 17 Должна быть обеспечена возможность иметь каждый процессор писать разные размер hyperslab, верно? МЭО) ВЫЗОВ h5dclose_f (dset_id, МЭО)! Освобождает Помощники DEALLOCATE (dimsf, chunk_dims, счетчики, смещение)! Закройте файл ВЫЗОВ h5fclose_f (file_id, МЭО)! Закройте Фортран интерфейс ВЫЗОВ h5close_f (МЭО) RETURN END SUBROUTINE write_parhdf5 Проблема, которую я получаю, что, когда я называю эту процедуру я получаю ошибку об ошибке: Неподдерживаемый тип данных передается ADIOI_Count_contiguous_blocks, объединитель = 17 Должна быть обеспечена возможность иметь каждый процессор писать разные размер hyperslab, верно?
Lazer
3

голосов
0

ответ
766

Просмотры

Parallel Python (pp) error SystemError: error return without exception set

Я использую Parallel Python (библиотеку с) для запуска достаточно большой (и чрезвычайная параллельности) работы. Мой код: # Parallel согласуется с С. четкости fit_label (этикетка, trainX, trainY, label_index): # печать 'Место', я 'метка из', длина (label_index) из sklearn.linear_model импорта SGDClassifier импорта NumPy как нп = CLF SGDClassifier (убыток = 'шарнирный', перетасовка = True, альфа = 0,000001, многословным = 0, n_iter = 5) temp_y = np.zeros (trainY.shape) temp_y [label_index [этикетка]] = 1 clf.fit (trainX, temp_y ) возвращение CLF ppservers = () job_server = pp.Server (ppservers = ppservers) печать "Начиная с п.п.", job_server.get_ncpus (), "рабочие" работа = [(этикетка, job_server.submit (fit_label, Args = (этикетка, trainX, trainY, label_index), модули = ( 'sklearn.linear_model',))) для метки в label_index.keys () [0: 8]] Это работает плавно с небольшим набором данных (т.е. trainX и trainY с 10000 строк), но когда я запускаю его на моем полном наборе данных (4mil строк), который составляет около 4 Гб, я получаю эту ошибку: / Users / MC /. virtualenvs / kaggle / Библиотека / python2.7 / сайт-пакеты / pp.pyc в подати (самостоятельно, FUNC, Args, depfuncs, модули, обратный вызов, callbackargs, группа, глобал) 458 459 sfunc = само .__ dumpsfunc ((FUNC,) + depfuncs, модули) -> 460 SARGS = pickle.dumps (арг, сам .__ pickle_proto) 461 462 самостоятельно .__ queue_lock.acquire () SystemError: возвращаемая ошибка без исключения установить я думаю, что я бег в маринаде ошибку, где он может» т обрабатывать большой файл. Что я могу сделать, чтобы обойти это? Я перепробовал много часов с многопроцессорной библиотекой и не получил его на работу - я также уверен, что я ударю эту проблему рассола, а также. Будет ли обновление до Python3 решить эту проблему? В работе [5]: os.sys.version Out [5]: «2.7.5 (по умолчанию, 25 августа 2013, 00:04:04) \ п [GCC 4.2.1 Совместимость Apple, LLVM 5.0 (лязг-500.0.68) ]»
mchangun
2

голосов
0

ответ
282

Просмотры

Joblib memory usage keeps growing

У меня следующая проблема. Моя цель состоит в том, чтобы обрабатывать кучу документов (принести все слова к нормальной форме, например, «был» -> «быть», «были» -> «быть», «пошел» -> «идти»). Это означает, мне нужно открывать каждый файл в директории, изменять его содержимое и сохранить его в другом каталоге. Так как процесс занимает много времени, я решил параллельно его с помощью joblib. Приведенный ниже код работает правильно (я имею в виду, он выполняет то, что он должен), но я столкнулся с огромной проблемой с памятью. Он продолжает постоянно расти! Он растет до тех пор, пока не осталось на сервере вообще памяти. от joblib импорта задерживается, Parallel четкости process_text (текст): # некоторая функция, которая обрабатывает # текст и возвращает новый текст возврата processed_text четкости process_and_save (document_id): с открытым (путь + document_id) как F: текст = f.read () текст = process_text (текст) е = открытая (other_path + document_id, 'ш') f.write (текст) f.close () all_doc_ids = # список документов идентификаторами, которые мне нужно обработать Parallel (n_jobs = 10) (задержка (process_and_save) (doc_id) для DOC_ID в all_doc_ids) Я также попытался изменить joblib в multipricessing: бассейн = бассейн (10) pool.map (process_and_save, all_doc_ids) Но ситуация оказалась точно так же. Существует ли какой-либо путь решения этой проблемы? И, конечно же, главный вопрос, почему это происходит даже? Спасибо! PS Документы достаточно малы, и процесс потребляет очень мало памяти при работе без параллелизма. закрыть () all_doc_ids = # список идентификаторов документов, которые мне нужно обрабатывать Parallel (n_jobs = 10) (замедленное (process_and_save) (DOC_ID) для DOC_ID в all_doc_ids) Я также попытался изменить joblib в multipricessing: бассейн = бассейн ( 10) pool.map (process_and_save, all_doc_ids) Но ситуация оказалась точно такой же. Существует ли какой-либо путь решения этой проблемы? И, конечно же, главный вопрос, почему это происходит даже? Спасибо! PS Документы достаточно малы, и процесс потребляет очень мало памяти при работе без параллелизма. закрыть () all_doc_ids = # список идентификаторов документов, которые мне нужно обрабатывать Parallel (n_jobs = 10) (замедленное (process_and_save) (DOC_ID) для DOC_ID в all_doc_ids) Я также попытался изменить joblib в multipricessing: бассейн = бассейн ( 10) pool.map (process_and_save, all_doc_ids) Но ситуация оказалась точно такой же. Существует ли какой-либо путь решения этой проблемы? И, конечно же, главный вопрос, почему это происходит даже? Спасибо! PS Документы достаточно малы, и процесс потребляет очень мало памяти при работе без параллелизма. Существует ли какой-либо путь решения этой проблемы? И, конечно же, главный вопрос, почему это происходит даже? Спасибо! PS Документы достаточно малы, и процесс потребляет очень мало памяти при работе без параллелизма. Существует ли какой-либо путь решения этой проблемы? И, конечно же, главный вопрос, почему это происходит даже? Спасибо! PS Документы достаточно малы, и процесс потребляет очень мало памяти при работе без параллелизма.
fremorie
2

голосов
0

ответ
282

Просмотры

Пытаясь распараллелить цикл, который вызывает функцию с аргументами

Я новичок в Python, и особенно новым для многопроцессорной / многопоточности. У меня есть проблемы с чтением документации, или найти достаточно похожий пример для работы прочь. Часть, что я пытаюсь разделить между несколькими ядрами является наклонной, остальное там контекста. Есть три функции, которые определены в других местах в коде, NextFunction (), QualFunction (), и PrintFunction (). Я не думаю, что они делают, это важно для распараллеливания этого кода, так что я не включил их определение. Можете ли вы помочь мне распараллелить это? До сих пор я смотрел на https://docs.python.org/2/library/multiprocessing.html Python многопроцессорных для цикла, и я попытался эквиваленты для многопоточности, и я попытался ipython.parallel, а также , Код предназначен для извлечения данных из файла, процесс его через несколько функций и распечатать его, проверки различных условий вдоль пути. Код выглядит следующим образом: Основная четкость (Arg, obj1Name, obj2Name): глобальные dblen запись = FASTA (refName) для I, R в Перечислите (записи): s = r.fastasequence IDNT = s.name.split () [0] ссылки [IDNT] имена = s.seq [I] = IDNT dblen + = Len (s.seq), если taxNm == Нет: taxid [IDNT] = GetTaxId (IDNT) .strip () records.close () для печати >> STDERR, "Читай" # читать taxids если taxNm = None: файл = открыт (taxNm, "г") для строки в файле:. IDNT, налог = line.strip () дробление () taxid [IDNT] = налог file.close () File1 = pysam.Samfile (obj1Name, "Р.Б.") File2 = pysam.Samfile (obj2Name, "Р.Б.") *** для obj1s, obj2s в NextFunction (file1, File2):
nietzschemouse
3

голосов
0

ответ
388

Просмотры

Прогон хранимых процедур через брокерское обслуживание

Я хотел бы выполнять хранимые процедуры параллельно в SQL Server 2014. Я решил принять подход, упомянутый в блоге Ruşanu (в http://rusanu.com/2009/08/05/asynchronous-procedure-execution/) и попытался пойти с пакетом брокера. Теперь параллельное выполнение - я поставил MAX_QUEUE_READERS 5 и попытался выполнить несколько длительных процедур погонных. Я также использовал ALTER DATABASE SET XXX ENABLE_BROKER для того, чтобы брокер услуг. Однако хранимая процедура usp_AsyncExecInvoke создает сообщение, но не выполняет usp_AsyncExecActivated хранимой процедуры с помощью очереди. Кто-нибудь есть предложения? Большое спасибо!
Cathy
2

голосов
0

ответ
46

Просмотры

R: Является ли параллельный импорт функций из NAMESPACE возможно?

Я разрабатываю большой пакет, который также является Блестящей приложение. Во время запуска приложения, есть вызов библиотека (имя_моего_пакет), которая приводит к загрузке все выборочно импортируемые функции из других пакетов. Для того, чтобы понять: я не называю библиотеки (otherPackages) - У меня есть большой NAMESPACE файл, который загружает только необходимые функции из других пакетов. Поскольку вы много зависимостей, весь процесс занимает много времени (к северу от 30-х лет). Есть ли способ, чтобы ускорить его с помощью параллельного выполнения? Я знаю, что я мог бы сделать это для библиотечных вызовов, но я не мог найти его только для загрузки NAMESPACE.
PSzczesny
2

голосов
0

ответ
57

Просмотры

Как установить Numpy степень параллелизма?

Я заметил, что когда я бегу Numpy функцию как numpy.dot, 4 ядра моей машины будет получить занят работой. Это означает, что, так или иначе, NumPy автоматически понимает, что он может распараллелить некоторые вычисления. Тем не менее, я на самом деле есть 8 ядер на моей машине, так что я хотел бы сказать NumPy, чтобы использовать их все. Вы знаете, как сделать это? Я следовал instrutions в Ограничить число нитей в NumPy, но они не работали. Я сообщаю выход numpy.show_config () ниже: lapack_opt_info: библиотеки = [ 'mkl_rt', 'потоковой'] library_dirs = [ '/ дом / anfri / anaconda2 / Библиотека'] define_macros = [( 'SCIPY_MKL_H', None), ( '' HAVE_CBLAS, отсутствует)] include_dirs = [ '/ главная / anfri / anaconda2 / включать'] blas_opt_info: библиотеки = [ 'mkl_rt', 'потоковой'] library_dirs = [»
4

голосов
0

ответ
446

Просмотры

What are the bottlenecks in implementing parallelism in NetLogo?

What are the specific implementation problems or bottlenecks that need to be tackled to implement an agent-based model or ABM modeling software, such as NetLogo? TL;DR version: What are the issues associated with implementing ABM software, NetLogo in particular, so that it is able to make use of multiple CPUs? What are the attempts at tackling those issues? What would be required to parallelize NetLogo? How differently would NetLogo work in parallel mode? Longer version: Currently, NetLogo executes simulations by sequentially proceeding one agent at a time. Although it is possible to run multiple models on a single machine (in separate NetLogo instances), or even different configurations of a specific model (in a single NetLogo instance) by means of BehaviorSpace [6], a single model runs on one CPU [2, 3]. There also is a pseudo-parallel mode of proceeding agents' behaviors by ask-concurrent command [4, 5], but it does not entail parallel execution on multiple CPUs. I have read about an attempt at parallelizing NetLogo implementing it in Haskell (HLogo implementation by Nikolaos Bezirgiannis) [1]. However, the author of the research project notes that “[e]xecution results show that HLogo is faster than NetLogo for most cases, particularly where the number of agents stay low. When the agent population grows as to produce significant number of STM conflicts, the performance of HLogo considerably drops.” Running simulations in a non-parallel, sequential manner is a huge slow-down compared to parallel execution, clearly. The fact that NetLogo implementation does not use multiprocessing/parallelism [with regard to single model runs] [2, 3] means that, most likely, there are some problems in doing so. What are those problems and how could they be solved? Materials that I have been able to find about the topic: “Improving Performance of Simulation Software Using Haskell’s Concurrency & Parallelism” thesis by Nikolaos Bezirgiannis http://dspace.library.uu.nl/handle/1874/284708 NetLogo / documentation / FAQ #Multiprocessing (“For a single model run, only one processor is used.”) http://ccl.northwestern.edu/netlogo/docs/faq.html#multiprocessing “Question about parallel running” http://netlogo-users.18673.x6.nabble.com/Question-about-parallel-running-td4869363.html “How to run several procedures simultaneously in NetLogo?” question on StackOverflow How to run several procedures simultaneously in NetLogo? Ask-concurrent in NetLogo documentation (“the behavior of ask-concurrent is completely deterministic.”) http://ccl.northwestern.edu/netlogo/docs/programming.html#ask-concurrent BehaviorSpace in NetLogo documentation http://ccl.northwestern.edu/netlogo/docs/behaviorspace.html
Agent
2

голосов
0

ответ
821

Просмотры

Ошибка в SocketConnection (мастер, порт = порт, блокировка = TRUE, открытый = «A + B»,: не может открыть соединение в Stan (от R)

Я на Macbook Pro Retina Display с 2012 года работает в El Capitan с 8 ядрами в соответствии с параллельным :: detectCores (). Мой брандмауэр выключен. Я выполняю следующий вызов из stan_lmer загруженного из пакета rstanarm. hierarchical.model.1 recvData -> makeSOCKmaster -> SocketConnection Дополнительно: Предупреждение Сообщение: В SocketConnection (мастер, порт = порт, блокировка = TRUE, открытый = "A + B",: локальный: 11058 не может быть открыт Исполнение остановлено Cc Cc
Brandon Sherman
2

голосов
0

ответ
89

Просмотры
2

голосов
0

ответ
77

Просмотры

Запуск сценария МПИ питона в IPython

Я простой скрипт следующим образом: # hello.py из mpi4py импорта MPI Comm = MPI.COMM_WORLD ранга = comm.Get_rank () печать ( «привет мир от процесса», звание) Я хочу, чтобы запустить его в ноутбук IPython с несколько процессоров. Как это сделать?
SpiderRico
2

голосов
0

ответ
525

Просмотры

Dynamic scheduling overhead

I have 2 loops, but I only want to parallelize the inner loop, since the pre- and post-processing can't be done in parallel. All foo() function calls together take 99% of the time, so I expect to get linear speedups when I parallelize the for loop with a pragma omp for, like on the code below. However, I only get a speedup of 1.87x for 2 threads. On the code below, nodelist contains the data structures used by foo(). These structures are a few small vectors and a matrix (foo() is compute bound). I'm using dynamic scheduling because each foo() call might have different execution times. while (changed){ //do some preprocessing #pragma omp parallel for schedule(dynamic) num_threads(N_THREADS) private(j) for (j = 0; j
fc67
2

голосов
0

ответ
115

Просмотры

MPI: Эффективный обмен различных объемов данных между всеми узлами

Я совершенно новый для MPI и не имею абсолютно никакого представления о том, что эффективно. У меня есть х (х = 2, 4, 8, 16, ...) узлы, каждый из них с большими текстовыми файлами более 4 миллионов строк. Я хочу, чтобы отсортировать эти строки, используя ведро рода, а для этого, я хочу послать правильные строки в каждый из узлов (= ведер), что означает, что я должен отправить (и получать) от каждого узла к любому другому узлу. В настоящее время моя идея такова: С моим корнем, я вычисляю ведро ограничивает, что каждый узел должен знать, чтобы они могли послать правильные строки в нужных узлов. Я вещать эти пределы, используя MPI_Bcast. После этого, так как подсчет каждого набора строк, предназначенных для отправки разные, я отправить счетчик строк, которые будут получены от каждого узла к любому другому узлу, используя MPI_Isend, MPI_IRECV и MPI_WAITALL. Когда каждый узел знает, сколько данных он будет получать от каждого узла, Я делаю то же самое для самих данных. Посылает и принимает выполняются для каждого переменного узла (процесс [я] хочет послать для обработки [I + 1], а затем получить от процесса [I-1]). Мой код для отправки и получения части выглядит следующим образом: // заполнить буфер для текущего ранга (потому что данные не должен быть отправлены) буфера [ранг] = ковши [ранг]; Int я, сумма, sendIndex, receiveIndex; // создать MPI_Requests INT reqsIndex = 0; MPI_Request dummyRequest; MPI_Request Reqs [numtasks - 1]; для (я = 0; г <numtasks - 1; я ++) Reqs [I] = MPI_REQUEST_NULL; // количество [я]: Какой процесс получает как много данных из текущего ранга междунар * составляет = таНос (SizeOf (INT) * (numtasks-1)); sendIndex = (ранг + 1)% numtasks; // всегда содержит индекс следующего процесса для отправки данных (начиная с [ранга + 1]) receiveIndex = (ранг + numtasks - 1)% numtasks; // всегда содержит индекс следующего процесса, чтобы получить данные из (начиная с [ранга - 1]) INT isSending = 1; // определяет, является ли текущий процесс посылает или принимает данные (всегда посылает первый) // чередуя передачи и приема для каждого процесса (я = 0; я <(numtasks - 1) * 2; я ++) {если (isSending) {MPI_Isend (& ведра [sendIndex] -> п, 1, MPI_INT, sendIndex, TAG_NUMBER_OF_SENDED_LINES, MPI_COMM_WORLD, & dummyRequest); sendIndex = (sendIndex + 1)% numtasks; если (== sendIndex ранга) sendIndex = (sendIndex + 1)% numtasks; } Еще {MPI_IRECV (& количества [receiveIndex], 1, MPI_INT, receiveIndex, TAG_NUMBER_OF_SENDED_LINES, MPI_COMM_WORLD, & Reqs [reqsIndex]); receiveIndex = (receiveIndex + 1)% numtasks; если (== receiveIndex ранга) receiveIndex = (receiveIndex + 1)% numtasks; reqsIndex ++; } IsSending = (isSending + 1)% 2; // переключатель isSending от 1 до 0 или от 0 до 1} MPI_WAITALL (numtasks - 1, Reqs, MPI_STATUSES_IGNORE); // ждет все получает должны быть завершены // запросы сброса reqsIndex = 0; для (я = 0; г <numtasks - 1; я ++) Reqs [I] = MPI_REQUEST_NULL; sendIndex = (ранг + 1)% numtasks; // всегда содержит индекс следующего процесса для отправки данных (начиная с [ранга + 1]) receiveIndex = (ранг + numtasks - 1)% numtasks; // всегда содержит индекс следующего процесса, чтобы получить данные из (начиная с [ранга - 1]) isSending = 1; // определяет, является ли текущий процесс посылает или принимает данные (всегда посылает первый) для (I = 0; г <(numtasks - 1) * 2; я ++) {если (isSending) {MPI_Isend (ведра [sendIndex] -> данных, ковши [sendIndex] -> п * LINE_LENGTH, MPI_BYTE, sendIndex, TAG_LINES, MPI_COMM_WORLD, & dummyRequest); sendIndex = (sendIndex + 1)% numtasks; если (== sendIndex ранга) sendIndex = (sendIndex + 1)% numtasks; } иначе {lineBuffer * = линия allocLines (суммы [receiveIndex]); MPI_IRECV (линии-> данные, составляет [receiveIndex] * LINE_LENGTH, MPI_BYTE, receiveIndex, TAG_LINES, MPI_COMM_WORLD, & Reqs [reqsIndex]); буфера [receiveIndex] = линия; receiveIndex = (receiveIndex + 1)% numtasks; если (== receiveIndex ранга) receiveIndex = (receiveIndex + 1)% numtasks; reqsIndex ++; } IsSending = (isSending + 1)% 2; // переключатель isSending от 1 до 0 или от 0 до 1} MPI_WAITALL (numtasks - 1, Reqs, MPI_STATUSES_IGNORE); // ждет все получает быть законченным В настоящее время, отправлять / получать раз для каждого узла, очень разные, некоторые процессы, гораздо больше времени, чтобы пройти через этот код, чем другие узлы. Есть ли что-то лучше, чем isend / irecv / WaitAll, особенно с учетом того, что все, что отправленное разного размера? Приветствия. :) некоторые процессы, гораздо больше времени, чтобы пройти через этот код, чем другие узлы. Есть ли что-то лучше, чем isend / irecv / WaitAll, особенно с учетом того, что все, что отправленное разного размера? Приветствия. :) некоторые процессы, гораздо больше времени, чтобы пройти через этот код, чем другие узлы. Есть ли что-то лучше, чем isend / irecv / WaitAll, особенно с учетом того, что все, что отправленное разного размера? Приветствия. :)
2

голосов
0

ответ
99

Просмотры

Inconsistent speed improvements with parallel execution in R?

I'm trying some basic things with parallel programming in R. The results have been very inconsistent. My first technique was to use the parSapply() function from the "parallel" library. The results are consistent. As I add more cores to the parallel process, speed improves notably: library(parallel) # Initiate test list testlist
Jerry Zhang
3

голосов
0

ответ
308

Просмотры

Hopac, как реализовать более тонкий MailboxProcessor?

Я не уверен, если я должен спросить это здесь или Hopac Wiki или если это больше похоже на дизайн вопрос, но здесь идет. Я недавно исследование F # агентов, чтобы пойти с моим кодированием, связанных Rx и наткнулся на следующий код Как создать очереди заданий с помощью MailboxProcessor? и подумал, что эй, разве это не то, что это идеально подходит для Hopac? Теперь у меня есть несколько вопросов в отношении о том, как на самом деле реализовать «очередь заданий», который может быть запущен и приостановленной в Hopac (как в посте очереди заданий). Вопрос: Как сохранить очередь Hopac.Jobs и иметь возможность приостанавливать обработку заданий из него, если это необходимо или, возможно, также ясно, что? Я мог бы реализовать явные очереди как в посте очереди заданий), но это в стороне, возможный ответ на этот вопрос меня интересует сам по себе тоже. Тогда вопрос для более общих рекомендаций: Я планирую сделать тысячи этих агентов, так что они принимают входной сигнал, скажем, из потока Rx или, возможно, есть один поток на агент, сделать некоторую обработку, а затем передавать результаты асинхронного интерфейса (скорее всего, это возвращает Task или Task) что может занять некоторое время, чтобы достигнуть или потерпеть неудачу (скажем, есть БД за интерфейсом), в этом случае я, возможно, захотите иметь тайм-аут и повторите попытку. Возможно, это может быть лучше достигнуто с помощью Rx очереди результаты работы, чтобы выходной поток Rx, но основные точки на основе задач взаимодействия интерфейса, тайм-аут и повторите после сбоя. Вопрос: Будет ли это ОК сценарий? Я aimiming к нескольким более реалистичному случаю использования в смешанном .NET база коды коды (то есть, C #, некоторые VB.N и F #), поэтому мнения и точка реализации будут оценены. Я взял реплику из образца бенчмарки Post Mailbox и создал следующий образец (реальную суть коды является JobProcessor) // Install-Package Hopac открытых Hopac открытого Hopac.Extensions открытого Hopac.Infixes открытого Hopac.Job.Infixes [] блок типа сообщения) переопределения x.Equals (объект) = матч OBJ с | :? Сообщение, как у -> сравнить ху | _ -> invalidArg «yobj» «не может сравнивать значения различных типов» интерфейс System.IComparable
Veksi
2

голосов
0

ответ
987

Просмотры

Можно ли ускорить привязку данных из GridView в ASP.NET с помощью Parallel.Invoke?

У меня есть asp.net GridView, который занимает много времени для загрузки из-за большого количества столбцов и (потенциально на основе пользовательского ввода) в целом много строк. Я уже использую AJAX, но было интересно, если вызов метода DataBind изнутри Parallel.Invoke может увеличить производительность без запуска риск повреждения данных. Какие-либо предложения?
field_b
2

голосов
0

ответ
175

Просмотры

Параллельно марка не работает на Windows, 7

Я сборочная среду, которая прекрасно работает на Windows XP. Но когда я переехал все на моем Windows 7 (x64) PC. сделать -j4 дает сообщение: сделать: Не указывать -j или -jobs если sh.exe не доступен. сделать: Сброс сделать для режима одного задания с помощью SHELL = CMD.EXE (также cmd.exe) не поможет. Зачем?
patseb
2

голосов
0

ответ
64

Просмотры

Tensorflow очередь и мульти тема: как использовать API данных

В настоящее время я пытаюсь реализовать Tensorflow трубопровода. Действительно я хочу, чтобы загрузить данные с моим процессором и использовать мой GPU для запуска графика в то же время. Для того, чтобы лучше, что происходит понять, я создал очень простую convolutionnal сеть: импорт ОС импорт h5py импорт tensorflow в ТФ os.environ [ «TF_CPP_MIN_LOG_LEVEL»] = «2» Sess = tf.InteractiveSession () из tensorflow.python .client импорта графики время импорта t1 = time.time () генератор класса: Защита __init __ (я, файл): self.file = файл Защита __call __ (сам): с h5py.File (self.file, 'г') как HF : для им в HF [ "данные".]: выход кортежа (им) набор данных = tf.data.Dataset () from_generator (генератор ( 'file.h5'), output_types = tf.float32, а = sess.run (выходные, опции = опции, run_metadata = run_metadata) печать ( 'сделано') fetched_timeline = timeline.Timeline (run_metadata.step_stats) chrome_trace = fetched_timeline.generate_chrome_trace_format () с открытым ( 'timeline_01.json', «ш «), как F: f.write (chrome_trace) t2 = time.time () печать (» TIME», t2-t1), и я не понимаю, результаты: первый, кажется, что количество потоков не имеет значения на время я потратить, чтобы запустить весь код. (68 секунд) Действительно, когда я комментирую следующие строки: конфиг = tf.ConfigProto () config.intra_op_parallelism_threads = 2 tf.Session (конфиг = конфигурации) это все та же ... второе, почему ГПУ и процессор не используется в то же время? Я делаю что-то неправильно ? Если кто-то может мне помочь, было бы очень приятно, потому что я ему уже провести два дня по этому вопросу. Большое спасибо за вашу помощь
Tbertin
4

голосов
0

ответ
370

Просмотры

веб-соскоб с rvest параллельно

Я хочу использовать rvest, чтобы очистить веб-страницы. Он отлично работает, но делать это параллельно выходит из строя. Пример библиотека (rvest) Библиотека (dplyr) ССЫЛКА% html_nodes ( "Вопрос-гиперссылка ")%>% html_attr (имя = "HREF")%>% пасты (" https://stackoverflow.com",., Сентябрь = "") Get_values% html_text ()} отлично работает DATA
Latrunculia
2

голосов
0

ответ
62

Просмотры

Scatterv/Gatherv with MPI to return a large vector

I'm new to MPI, and I've been tasked to use it to calculate a very large matrix of size L*M as part of a larger body of code. We iterate from 0 to L, perform some calculations, and save M values to the result matrix. The results from each iteration over L are independent of one another and its the largest time bottleneck in my code, so parellelizing it seems like a reasonable choice. The code I am trying to parallelize is, boiled down: //preceding code int M = 12; for (int i = 0; i < L; i++) //START OF PARALLEL CHUNK { funkystuffresults = dosomefunkystuff(i); for (int j = 0; j < M; j++) { resultmatrix[i*M + j] = funkystuffresults } }//END OF PARALLEL CHUNK Due to the nature of the code that precedes this chunk, I can't be certain of the value of L before runtime and it almost certainly can't be cleanly divided by the number of processes. From my research, it appears to me like MPI_Scatterv is the ideal function to use here. My initial attempt at using this code: MPI_Comm_size(MPI_COMM_WORLD, &world_size); MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); int sendcounts[world_size]; int displs[world_size]; vector rec_buf(L); int rem = L%world_size; int counttester = 0; for (int i = 0; i < world_size; i++) { sendcounts[i] = L/world_size; if (rem > 0) { sendcounts[i]++; rem--; } displs[i] = counttester; counttester += sendcounts[i]; } vector paralleli(L); for (int i = 0; i < L; i++) { paralleli[i] = i; } MPI_Scatterv(¶lleli, sendcounts, displs, MPI_INT, &rec_buf, L, MPI_INT, 0, MPI_COMM_WORLD); for (int i = 0; i < sendcounts[world_rank]; i++) //START OF PARALLEL CHUNK { //previously mentioned code } This seems very unwieldy to me for what I would imagine is a pretty common type of problem. To use this code will require a significant amount of modifying the "funky stuff" in my code, so I'm hoping there is a better way to do this. Is it ideal to be using scatterv (and presumably gatherv afterwards)? I'm hoping to use an implementation that also works even if parallelization is not used.
SMartens
2

голосов
0

ответ
47

Просмотры

GPGPU Строка поиска в другой

Я ищу алгоритм для поиска одной строки в другую, но я знаю, что строки are'nt поддерживаются в CUDA или OpenCL изначально (но я увидел пост, который показывает, что OpenCL может получить массив символов, как код ниже) __kernel недействительным тест (__ глобальная word_t * данные, Подружился res_t * результат) {size_t ID = get_global_id (0); INT размер = 0; INT = размер данных [ID] .LEN; // локальная память "Распределитель" __local Int смещение = 0; летучее __local INT * pOffset = & смещения; __local символ wordBuffer [BUFFER_SIZE]; // "выделить" память INT myOffset = atomic_add (pOffset, размер); // работает со словом __local полукокса * pThreadWord = & wordBuffer [myOffset]; } У меня есть много больших и маленьких строк, и я должен искать присутствие (и определения положения) этих мало на больших строк параллельно, Может кто-нибудь мне помочь? пс: этот код был найден: с помощью «строки» в OpenCL ядра
Helton Fábio
2

голосов
0

ответ
47

Просмотры

Алгоритм группы подобного типа сообщения путем сопоставления с помощью регулярных выражений?

У меня есть список предопределенных строк регулярных выражений шаблона (около 7 тысяч типов регулярных выражений шаблона для группы подобного типа сообщений). Теперь у меня есть два набора в один список для регулярных выражений шаблонов, а другого для реальных сообщений, которая содержит некоторые имена переменных. Мне нужно сгруппировать все подобные сообщения и показать те сгруппированных сообщения, Теперь у меня есть маршрутные модели 7000 регулярных выражения для группы аналогичных объектов в 1000 сообщениях. Он принимает т * п итераций, чтобы найти правильные группы. Для того, чтобы сократить время обработки, я извлекал соответствие элементов из списка сообщений. например, 1000 - (совпадающая элементы на предыдущей итерации). Это занимает слишком много времени для обработки этих двух списков. Для того, чтобы сократить время, я сгруппировал его на категории сообщений типа и их обработки в параллельных задач. Список warningKBErrors = distinctKBErrors.Where (kbErr => kbErr.ErrorType == "Предупреждение" ).К списку(); Список fatalKBErrors = distinctKBErrors.Where (kbErr => kbErr.ErrorType == "Fatal") ToList (). Список severeKBErrors = distinctKBErrors.Where (kbErr => kbErr.ErrorType == "Тяжелые") ToList (). Список cbeccErrorKBErrors = distinctKBErrors.Where (kbErr => kbErr.ErrorType == "Ошибка") ToList (). // Удалить все сообщение об ошибке, которое должно быть обработано errors.RemoveAll (ошибка => processingErrorType.HasFlag (error.ErrorType)!); Список warningErrors = errors.Where (kbErr => kbErr.ErrorType == ErrorType.Warning) .ToList (); Список fatalErrors = errors.Where (kbErr => kbErr.ErrorType == ErrorType.Fatal) .ToList (); Список severeErrors = errors.Where (kbErr => kbErr.ErrorType == ErrorType.Severe) .ToList (); Список cbeccErrors = errors.Where (kbErr => kbErr.ErrorType == ErrorType.Error) .ToList (); После того, что эти сообщения обрабатываются в параллельной задаче путем разбиения их в равном подмножестве элементов. Func FindDistinctErrorMessages = (filteredKBErros, filteredErros) => {ConcurrentBag errorsList = новый ConcurrentBag (); объект lockObject = новый объект (); System.Diagnostics.Stopwatch SW = новый System.Diagnostics.Stopwatch (); sw.Start (); Parallel.For (0, filteredKBErros.Count, () => новый словарь (), (х, loopState, kpErrorResult) => {kpErrorResult.Add (filteredKBErros [(целое) х], filteredErros .где (ошибка => Regex. IsMatch (error.ErrorMessage, filteredKBErros [(целое) х] .ErrorMessage, System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace)) ToList ());. вернуть kpErrorResult;} (kpErrorResult) => {Блокировка (lockObject) {Еогеасп (KeyValuePair errorResult в kpErrorResult) {если (errorResult.Value.Count> 0) {ошибка Ошибка = NULL; если (errorResult.Value.Count == 1) {Ошибка = errorResult.Value.First (); } Еще {Ошибка = Ошибка новый (); error.ErrorMessage = errorResult.Value.First () ErrorMessage. error.Errors = errorResult.Value; error.ErrorType = errorResult.Value.First () ERRORTYPE. } Error.ErrorCount = errorResult.Value.Count; error.ErrorCode = errorResult.Key.ErrorCode; AddErrorResolutionMessage (ошибка, errorResult.Key); error.ErrorMessagePattern = errorResult.Key.ErrorMessage; errors.Add (ошибка); errorResult.Value.ForEach (ERR => errors.Remove (ERR)); }}}}); sw.Stop (); System.Diagnostics.Debug.WriteLine (String.Format ( "Завершенный в {0} секунд", sw.Elapsed.TotalSeconds)); вернуть errors.ToList (); }; // Фильтр Предупреждение KB Список Список filteredWarningKBList = FilterKBList (warningKBErrors, warningErrors); Список filteredSevereKBList = FilterKBList (severeKBErrors, severeErrors); Список filteredFatalKBList = FilterKBList (fatalKBErrors, fatalErrors); Список filteredcbeccErrorsKBList = FilterKBList (cbeccErrorKBErrors, cbeccErrors); Список задачи = новый список (); если (warningErrors.Count> 0 && (processingErrorType.HasFlag (ErrorType.Warning) || processingErrorType.Equals (ErrorType.All))) {INT equalCounts = warningErrors.Count <10? 1: warningErrors.Count / 10; Еогеасп (IEnumerable подмножество в warningErrors.Split (equalCounts)) {tasks.Add (Task.Run (() => FindDistinctErrorMessages (filteredWarningKBList, subSet.ToList ()), CancellationToken.None)); }} Если (severeErrors.Count> 0 && (processingErrorType.HasFlag (ErrorType.Severe) || processingErrorType == ErrorType.All)) {INT equalCounts = severeErrors.Count <10? 1: severeErrors.Count / 10; Еогеасп (IEnumerable подмножество в severeErrors.Split (equalCounts)) {tasks.Add (Task.Run (() => FindDistinctErrorMessages (filteredSevereKBList, subSet.ToList ()), CancellationToken.None)); }} Если (fatalErrors.Count> 0 && (processingErrorType.HasFlag (ErrorType.Fatal) || processingErrorType.Equals (ErrorType.All))) {INT equalCounts = fatalErrors.Count <10? 1: fatalErrors.Count / 10; Еогеасп (IEnumerable подмножество в fatalErrors.Split (equalCounts)) {tasks.Add (Task.Run (() => FindDistinctErrorMessages (filteredFatalKBList, subSet.ToList ()), CancellationToken.None)); }} Если (cbeccErrors.Count> 0 && (processingErrorType.HasFlag (ErrorType.Error) || processingErrorType.Equals (ErrorType.All))) {INT equalCounts = cbeccErrors.Count <10? 1: cbeccErrors.Count / 10; Еогеасп (IEnumerable подмножество в cbeccErrors.Split (equalCounts)) {tasks.Add (Task.Run (() => FindDistinctErrorMessages (filteredcbeccErrorsKBList, subSet.ToList ()), CancellationToken.None)); }} После запуска этих задач, это занимает много времени, чтобы выполнить эти задачи. ждать заявление на эти созданные задачи каким-то образом поставить приложение в состоянии похмелья. попробуйте {List результат = новый список (); Task.WaitAll (tasks.ToArray ()); Еогеасп (вар задача в задачах) {result.AddRange (task.Result); } Результат = result.Distinct () ToList (). Ошибка result.GroupBy (Рез => res.ErrorMessagePattern) .ToList () .ForEach (GRP => {Ошибка = grp.First (); error.ErrorCount = grp.Sum (г => r.ErrorCount); если (GRP .Count ()> 1) {grp.ToList (). ForEach (grpElement => {если (grpElement = ошибка) {если (error.Errors == NULL) error.Errors = новый список (!); GrpElement.ErrorCount = 1, если (grpElement.Errors = NULL && grpElement.Errors! .Count> 0) {error.Errors.AddRange (grpElement.Errors); grpElement.Errors = NULL;}}}); } DistinctErrors.Add (ошибка); }); } Наконец {} errors.ForEach (ошибка => {error.ErrorCount = 1; AddErrorResolutionMessage (ошибка, NULL); distinctErrors.Add (ошибка); если (error.PossibleResolution == "не найден" ) LogMessage.AppendLine (error.ErrorMessage); }); Есть ли лучший способ или алгоритм, чтобы сократить время обработки этих списков и снизить трудоемкость процесса, а обработка MXN элементов?
Niranjan Singh
3

голосов
0

ответ
111

Просмотры

Объединение локальных процессов с удаленными процессами в Юле

Я пытаюсь использовать удаленные процессы в conjuntion с локальными процессами, но , когда я могу получить следующие выходные Юлю> addprocs ([» пользователь @ хост „], туннель = верно, реж =“~ / джулия-79599ada44 / бен / », sshflags =` -p 6969`) идентификатор: не может найти название для группы ID 350 1-элемент массива {Любой, 1}: 2 Юлю> addprocs (23) со смертельным исходом ошибок на 2: ошибка: подключение: хост недоступен (EHOSTUNREACH ) в ожидании в ./task.jl:284 в ожидании в ./task.jl:194 в stream_wait в stream.jl: 263 в wait_connected на stream.jl: 301 в Worker в multi.jl: 113 в анонимном в задаче. JL: 905 неисправимая ошибка на неисправимой ошибке 5: 6: неисправимая ошибки на неисправимой ошибке на неисправимой ошибке 9: 14: 8: работник 3 прекращаются. ... Я пытался добавить локальные процессы первыми , но я получаю те же ошибки , когда я добавить удаленные из них.
Pedro G.
2

голосов
0

ответ
97

Просмотры

TypeDescriptor.GetProperties () всегда возвращает ту же ссылку PropertyDescriptorCollection. Причинение параллельных задач обработки

Введение: Я работаю на перемещение библиотеки к обработке данных параллельно, и есть 85% + разногласий между потоками на PropertyDescriptor.GetValue (), что делает параллельную обработку на нескольких ядрах то же самое, а иногда хуже, чем обработка на одном ядро. Проблема: Когда TypeDescriptor.GetProperties (тип), называется, кажется, возвращаются одни и те же ссылки на тот же PropertyDescriptorCollection, которая имеет те же ссылки на все те же объекты PropertyDescriptor. Это проблематично, потому что нужны новые наборы PropertyDescriptor для каждого потока. Разделение же ресурсов вызывает нити постоянно блокируют друг друга. Параллелизм Профилирование Выход: Грубый Пример: государственный статическая сила Test () {вар class1 = новые ExampleClass (); вар class2 = новые ExampleClass (); вар test1 = TypeDescriptor. GetProperties (TypeOf (ExampleClass)); вар test2 = TypeDescriptor.GetProperties (TypeOf (ExampleClass)); Console.WriteLine (Object.ReferenceEquals (test1, test2)); INT = 0; Еогеасп (PropertyDescriptor элемент в test1) {Console.WriteLine (Object.ReferenceEquals (test1 [I], test2 [I])); я ++; }} В этом случае, каждый Object.ReferenceEquals возвращает истину. Показано, что оба они имеют в виду те же объекты, и не различны. Это вызывает серьезные проблемы с производительностью, когда несколько потоков вызовом GetValue () на тот же объект PropertyDescriptor. Как я могу получить совершенно новые объекты PropertyDescriptor для каждого объектов недвижимости? Примечание: Та же проблема occurres с помощью PropertyInfo, извлекаемые myType.GetProperties (). В PropertyInfos он возвращает ссылку на те же объекты, так даже, что выполняет кэширование. Дополнительная информация / Результаты: The MethodInfo для тех свойств добытчиков также кэшируются внутри PropertyInfo. Поэтому получение и применение метода не параллелизуемое, так как он будет опираться на тот же экземпляр MethodInfo для всех потоков. Процесс, который PropertyDescriptor (ReflectPropertyDescriptor) проходит во GetValue () использует Type.GetProperty () (RunTimeType.GetProperty ()), который использует свойство информации кэша для возврата результатов. Это означает, что PropertyDescriptor и PropertyInfo, кажется, используют один и тот же общий кэш для возврата информации о собственности экземпляры, которые они оба используют для доступа к свойствам геттер метод (который также кэшируются). TL; DR: Это кэш весь путь вниз. MethodInfo для тех свойств добытчиков также кэшируются внутри PropertyInfo. Поэтому получение и применение метода не параллелизуемое, так как он будет опираться на тот же экземпляр MethodInfo для всех потоков. Процесс, который PropertyDescriptor (ReflectPropertyDescriptor) проходит во GetValue () использует Type.GetProperty () (RunTimeType.GetProperty ()), который использует свойство информации кэша для возврата результатов. Это означает, что PropertyDescriptor и PropertyInfo, кажется, используют один и тот же общий кэш для возврата информации о собственности экземпляры, которые они оба используют для доступа к свойствам геттер метод (который также кэшируются). TL; DR: Это кэш весь путь вниз. MethodInfo для тех свойств добытчиков также кэшируются внутри PropertyInfo. Поэтому получение и применение метода не параллелизуемое, так как он будет опираться на тот же экземпляр MethodInfo для всех потоков. Процесс, который PropertyDescriptor (ReflectPropertyDescriptor) проходит во GetValue () использует Type.GetProperty () (RunTimeType.GetProperty ()), который использует свойство информации кэша для возврата результатов. Это означает, что PropertyDescriptor и PropertyInfo, кажется, используют один и тот же общий кэш для возврата информации о собственности экземпляры, которые они оба используют для доступа к свойствам геттер метод (который также кэшируются). TL; DR: Это кэш весь путь вниз. Процесс, который PropertyDescriptor (ReflectPropertyDescriptor) проходит во GetValue () использует Type.GetProperty () (RunTimeType.GetProperty ()), который использует свойство информации кэша для возврата результатов. Это означает, что PropertyDescriptor и PropertyInfo, кажется, используют один и тот же общий кэш для возврата информации о собственности экземпляры, которые они оба используют для доступа к свойствам геттер метод (который также кэшируются). TL; DR: Это кэш весь путь вниз. Процесс, который PropertyDescriptor (ReflectPropertyDescriptor) проходит во GetValue () использует Type.GetProperty () (RunTimeType.GetProperty ()), который использует свойство информации кэша для возврата результатов. Это означает, что PropertyDescriptor и PropertyInfo, кажется, используют один и тот же общий кэш для возврата информации о собственности экземпляры, которые они оба используют для доступа к свойствам геттер метод (который также кэшируются). TL; DR: Это кэш весь путь вниз.
Douglas Gaskell