Я пытался использовать ограниченные квалифицированные указатели и столкнулся с проблемой. Приведенная ниже программа является простой и предназначена только для представления проблемы.
Функция calc _использует три указателя, которые ограничены, поэтому они НЕ ДОЛЖНЫ быть псевдонимами друг друга. При компиляции этого кода в Visual Studio функция будет встроена, поэтому Visual Studio 2010 без причины игнорирует квалификаторы. Если я отключу встраивание, код будет выполняться более чем в шесть раз быстрее (с 2200 мс до 360 мс ). Но я не хочу отключать встраивание ни во всем проекте, ни во всем файле (, потому что тогда это вызовет накладные расходы, например. все геттеры и сеттеры, что было бы ужасно ).
(Может быть, единственным решением будет отключить встраивание только этой функции?)
Я попытался создать в функции временные ограничивающие квалифицированные указатели, как вверху, так и во внутреннем цикле, чтобы попытаться сообщить компилятору, что я обещаю, что псевдонимов не будет, но компилятор мне не поверит, и он не будет Работа. Я также пытался настроить параметры компилятора, но единственное, что я нашел, это отключить встраивание.
Я был бы признателен за помощь в решении этой проблемы оптимизации.
Чтобы запустить программу (в реальном режиме ), не забудьте использовать аргументы 0 1000 2000. Почему использование аргументов пользовательского ввода/программы должно быть уверенным, что компилятор не может знать, есть ли псевдонимы между указателями a, b и c.
#include <cstdlib>
#include <cstdio>
#include <ctime>
// Data-table where a,b,c will point into, so the compiler cant know if they alias.
const size_t listSize = 10000;
int data[listSize];
//void calc_function(int * a, int * b, int * c){
void calc_function(int *__restrict a, int *__restrict b, int *__restrict c){
for(size_t y=0; y<1000*1000; ++y){ // <- Extra loop to be able to messure the time.
for(size_t i=0; i<1000; ++i){
*a += *b;
*c += *a;
}
}
}
int main(int argc, char *argv[]){ // argv SHALL be "0 1000 2000" (with no quotes)
// init
for(size_t i=0; i<listSize; ++i)
data[i] = i;
// get a, b and c from argv(0,1000,2000)
int *a,*b,*c;
sscanf(argv[1],"%d",&a);
sscanf(argv[2],"%d",&b);
sscanf(argv[3],"%d",&c);
a = data + int(a); // a, b and c will (after the specified argv) be,
b = data + int(b); // a = &data[0], b = &data[1000], c = &data[2000],
c = data + int(c); // So they will not alias, and the compiler cant know.
// calculate and take time
time_t start = clock();
funcResticted(a,b,c);
time_t end = clock();
time_t t = (end-start);
printf("funcResticted %u (microSec)\n", t);
system("PAUSE");
return EXIT_SUCCESS;
}