Что может пойти не так, как надо, если Вам не удается переопределить GetHashCode (), когда переопределение Равняется ()? [дубликат]

Вы можете определить пользовательское сокращение следующим образом:

#pragma omp declare reduction \
    (addps:__m128:omp_out+=omp_in) \
    initializer(omp_priv=_mm_setzero_ps())

А затем использовать его следующим образом:

#pragma omp parallel for reduction(addps:average)
for(size_t k = 0; k < size * ch; k += ch)
{
  average += _mm_loadu_ps(data+k);
}

Я думаю, что самое важное, openmp должен знать, как получите нейтральный элемент (здесь _mm_setzero_ps()) для вашего сокращения.

Полный рабочий пример: https://godbolt.org/z/Fpqttc

Интересная ссылка: http://pages.tacc.utexas.edu/~eijkhout /pcse/html/omp-reduction.html#User-definedreductions

17
задан Community 23 May 2017 в 12:22
поделиться

4 ответа

Самый видимый путь для отображения структур.

Любой класс, который делает это, будет иметь непредсказуемое поведение при использовании в качестве Ключа для Словаря или HashTable. Так как причина, то, что реализация использует и GetHashCode и Равняется для надлежащего нахождения значения в таблице. Короткая версия алгоритма является следующим

  1. , Берут модуль HashCode количеством блоков, и это - индексный
  2. Вызов блока.Equals () для указанного Ключа и каждого Ключа в конкретном блоке.
  3. , Если существует соответствие, которое является значением, никакое соответствие = никакое значение.

Отказ сохранить GetHashCode и Равняется в синхронизации, полностью повредит этот алгоритм (и многочисленные другие).

9
ответ дан 30 November 2019 в 14:36
поделиться

Думайте о хеше / структура словаря как набор пронумерованных блоков. Если Вы всегда помещаете вещи в блок, соответствующий их GetHashCode (), то только необходимо искать один блок (использование Равняется ()) видеть, там ли что-то. Это работает, если Вы смотрите в правильном блоке.

, Таким образом, правило: если Равняется (), говорит, что два объекта Равны (), они должны иметь тот же GetHashCode ().

1
ответ дан 30 November 2019 в 14:36
поделиться

Если Вы не переопределяете GetHashCode, ничто, что выдерживает сравнение, Ваши объекты могут понять его превратно.

, Поскольку это документируется, что GetHashCode должен возвратить то же значение, если два экземпляра равны, то это - прерогатива любого кода, который хочет протестировать их на равенство для использования GetHashCode в качестве первой передачи в объекты группы, которые могут быть равными (поскольку это знает, что объекты с различными хэш-кодами не могут быть равными). Если Ваш GetHashCode метод возвращает различные значения для равных объектов тогда, они могут войти в различные группы в первой передаче и никогда не сравниваются с помощью их Equals метод.

Это могло влиять на любую структуру данных типа набора, но будет особенно проблематично в основанных на хэш-коде, таких как словари и наборы хеша.

Короче говоря: Всегда переопределение GetHashCode, когда Вы переопределяете Equals и гарантируете их реализации, последовательно.

0
ответ дан 30 November 2019 в 14:36
поделиться

Любой алгоритм, который использует Ключ, не будет работать, предполагая, что он полагается на намеченное поведение ключей хеша.

Два объекта, которые являются Equal, должны иметь то же значение ключа хеша, которое удаленно не гарантируется реализацией по умолчанию.

0
ответ дан 30 November 2019 в 14:36
поделиться