Как создать указатель ограничения из указателя без ограниченийC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как создать указатель ограничения из указателя без ограничений

Сообщение Anonymous »

Вот мотивирующий пример
void foo(int *A, int *B, int *N) {
for (int k = 0; k < *N; k++)
A[k] += B[k];
}

Компилятор не может векторизовать этот цикл, поскольку предполагает, что A и N являются псевдонимами. Добавление ограничения к N включает векторизацию. например, https://godbolt.org/z/joMrhEM8K
void foo(int *A, int *B, int *__restrict N) {
for (int k = 0; k < *N; k++)
A[k] += B[k];
}

генерирует
.LBB0_9:
ldp q0, q3, [x11, #-16]
subs x12, x12, #8
ldp q1, q2, [x10, #-16]
add x10, x10, #32
add v0.4s, v0.4s, v1.4s
add v1.4s, v3.4s, v2.4s
stp q0, q1, [x11, #-16]
add x11, x11, #32
b.ne .LBB0_9

И это хорошо. Но я хочу создать ограниченный указатель из N и не изменять объявление функции. например, что-то вроде
void foo(int *A, int *B, int *N) {
int *__restrict p = N;
for (int k = 0; k < *p; k++)
A[k] += B[k];
}

Но это не работает. Есть ли способ добиться этого?
Причина, по которой я хотел бы добиться этого, заключается в том, что тогда я смогу «версировать» код без добавления __restrict в объявлении. нравится:
// Returns true if X, Y don't alias.
bool no_alias(int* X, int *Y);

void foo(int *A, int *B, int *N) {
if (no_alias(A,N)) { // assuming I have a way to figure out that A and N don't alias at runtime.
int *__restrict p = N;
for (int k = 0; k < *p; k++)
A[k] += B[k];
} else {
for (int k = 0; k < *p; k++)
A[k] += B[k];
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... ct-pointer
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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