Есть ли способ заставить Clang использовать непреднамеренную инструкции x86 на Load/Store?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Есть ли способ заставить Clang использовать непреднамеренную инструкции x86 на Load/Store?

Сообщение Anonymous »

Я пытаюсь использовать Clang в большом проекте Visual Studio. Есть много MS-специфического кода, в том числе C ++ /CLI и MSTest, которые не могут быть составлены с помощью Clang, поэтому это состав библиотек, составленных Microsoft Compiler (версия 17.2 /VS 2022) и Clang-Cl (13.0.2). Как < /p>

Код: Выделить всё

struct tx
{
alignas(32) double m_data[12];
}
Проблема в том, что Microsoft не всегда выполняет требования выравнивания. Большую часть времени он будет должным образом выравнивать данные, но иногда (обычно для временных переменных) он выделяет неординарные структуры. Например, < /p>

Код: Выделить всё

struct edge_object
{
...
tx m_pos;
};

int c = sizeof(edge_object);  // 256
int a = alignof(edge_object); // 32
int b = offsetof(edge_object, tx); // 160

std::vector edges;
for (int i = 0; i < n - 1; ++i)
{
edges.push_back(edge_object( (edge_id_t)i, test_cost_0, lower_v[i], lower_v[i + 1], tx ));
edges.push_back(edge_object( (edge_id_t)(n + i), test_cost_0, upper_v[i], upper_v[i + 1], tx ));
}
В этом фрагменте кода компилятор MS выравнивает первое временное edge_object правильно (например, он переместит его 32 байта, если я выделяю несколько дополнительных переменных в стеке), но он ставит второе временное edge_object в совершенно странное местоположение (в положении сменяется 78H, снявшись с положения, не снимая по позиции. MS сходит с рук, потому что она всегда выпускает невыполненные инструкции по загрузке/хранилищу (даже если явно говорится, что для использования выровненной загрузки/хранилища), поэтому даже если объект не выровнен, сгенерированный код все равно будет работать. Clang, с другой стороны, - это выпуска выровненные инструкции по загрузке. Я начал с замены всей внутренней системы, таких как _MM256_Load_ps на _mm256_loadu_ps в моем собственном векторизованном коде, но, к сожалению, Clang достаточно умный, чтобы выпустить свои собственные выровненные нагрузки, когда я видит, что Alignas (32) . Компиляторы MSVC и ICC делают? Как потенциальный обходной путь, я могу заставить Clang сделать это, изменив выравнивание на 8 вместо 32, но это повредит производительности. Подход MS, с другой стороны, почти такой же быстрый, когда ему удается правильно выравнивать данные (vmovups и vmovaps на современных процессорах, имеют почти одинаковую производительность для правильно выровненных адресов), но не сбой, когда выравнивание неверно из -за ошибки компилятора. Есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/725 ... structions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»