Код .Net 4.0 будет работать на Core 2 Duo, но не на i5.Нужен совет - PullRequest
0 голосов
/ 14 января 2012

Я написал очень сложный многопоточный код. Он использует спиннинг, выходы и библиотеку блокировок.

Код работает безупречно на моей машине с Core 2 Duo 2 ГГц. На моей двухъядерной четырехъядерной машине с частотой 2,4 ГГц i5 она работает медленно (например, медленнее, чем Core 2) или полностью не работает (просто работает на 0% ЦП).

Обе машины имеют Win 7 Home Premium 64 bit и .Net 4.5 framework. Моя машинная разработка - Core 2 Duo. Я разработал в Visual Studio 2011 Dev Preview. Код скомпилирован с оптимизацией на.

Я не могу вставить несколько строк кода здесь. Может ли кто-нибудь даже начать говорить мне, почему это может происходить / что искать в моем коде. Я немного шокирован этим результатом сборки .Net.

EDIT

Я проверил скорость BlockingCollection от MS, и это тоже была доля скорости на i5, но все 4 «ядра» были на 100% = некоторый тип состояния гонки. Однако здесь я просто вызываю методы TryAdd () / Take () без вращения или любого другого типа управления потоком с моей стороны.

Ответы [ 2 ]

3 голосов
/ 14 января 2012

Весьма вероятно, что вы испытываете состояние гонки. Симптомы налицо - у вас сложный многопоточный код, который либо не работает, либо не работает так, как вы ожидаете, и поведение на разных машинах различается. Тот факт, что он работает на двухъядерном процессоре, не доказывает, что код не содержит гонок ... Чем больше ядер, тем выше вероятность появления тонких гонок.

Короче, нам нужен код, чтобы помочь.

Вы упоминаете, что используете "спиннинг-класс" - вы имеете в виду SpinLock и SpinWait?

2 голосов
/ 14 января 2012

Без кода я могу только строить догадки:

В Core i5, как известно, используется технология гиперпоточности Intel, которая позволяет довести число аппаратных потоков до 4 с использованием только двух ядер, поэтому у вас фактически есть четыре потока, конкурирующие за одинаковые функциональные блоки ЦП. Это означает, что вычислительные приложения или приложения, которым требуется большая пропускная способность памяти, могут страдать от снижения производительности при использовании на процессорах с технологией HT. Попробуйте установить число потоков, порождаемых вашим приложением, равным 2 (таким образом, вы фактически не используете функцию HT) и посмотрите, работает ли она так же, как и на исходном двухъядерном процессоре.

Также проверьте эту статью на наличие особенностей и недостатков HT: http://software.intel.com/en-us/articles/performance-insights-to-intel-hyper-threading-technology/

И этот (отчасти) связанный с этим вопрос: Многопоточная Java не ускоряет

...