LLVM: выяснить, является ли переменная функцией других переменных - PullRequest
2 голосов
/ 01 декабря 2011

Есть ли способ в llvm, что с помощью статического анализа я могу выяснить, является ли одна переменная определенной функцией других переменных?

Например: как и в программе cuda, я хочу узнать, учитывая переменную tid, хранит ли она глобальный идентификатор потока или нет?

int tid = blockIdx.x * blockDim.x + threadId.x; 

Редактировать: я пытаюсь выяснить, могу ли я написать проход, который анализирует программу и проверяет, основано ли любое расхождение или доступ к массиву только на этом глобальном идентификаторе, а не на других значениях, таких как blockID или local threadId. Я пытаюсь определить случаи, когда изменение gridDim программы cuda, blockDim не изменяет вывод программы, как, например, добавление вектора, я могу иметь gridDim как 128, blockDim как 4 или gridDim как 8, blockDim как 64. Выходные данные не влияет. Я делаю это в llvm, потому что я пытаюсь использовать среду компиляции под названием ocelot, которая конвертирует cuda в x86.

1 Ответ

2 голосов
/ 01 декабря 2011

Самый близкий, который я могу найти, - это пропуск memdeps , но это в первую очередь касается других операций с памятью, которые необязательно соответствуют операциям с «переменными» в обычном смысле - они могут быть в регистрах,Однако это кажется разумной стандартной проблемой анализа зависимостей, поэтому, возможно, вы могли бы изменить этот этап в соответствии со своими потребностями. анализ псевдонимов проходов также может быть полезен, хотя и при отсутствии операций, которые мешают переменным псевдонимов друг другу (например, копии, арифметика).

Кстати, ваш вопрос скорее-specified.Обычно это такой анализ (например, анализ псевдонимов), который будет иметь больше смысла на исходном языке (например, cuda), а не на целевом языке (например, LLVM).

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