У нас есть назначение, где нам предоставляется очень неэффективная программа, и мы должны оптимизировать код, чтобы он работал быстрее. У меня большая часть из них идет довольно быстро, за исключением этих двух, что меня так сильно задевает, потому что они ОЧЕНЬ просто функционируют. Один из них в основном устанавливает все значения в двумерном массиве на одно и то же значение, а один в основном меняет значения двух двухмерных массивов. И в этом проблема. Они занимают больше всего времени, но поскольку они такие простые, я не могу понять, как их уменьшить, не нарушая функций. И я знаю, что можно заставить их работать быстрее, потому что другие студенты в классе получают нелепые ускорения. Эти два вопроса:Оптимизация вложенных циклов
fSetArray(int rows, int cols, float val)
{
int i, j;
F2D *out;
out = fMallocHandle(rows, cols);
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
subsref(out,i,j) = val;
return out;
}
Единственная важная часть - это две петли. В принципе, у нас есть двухмерный массив с определенной шириной (строками) и определенной высотой (cols), и мы устанавливаем ВСЕ значения в val. Но я не вижу возможности устранить одну из циклов (что было бы лучшим способом ускорить ее). Если я не пропущу что-то очевидное. Если cols и rows были одинаковыми, это было бы намного проще.
Другая функция:
fDeepCopy(F2D* in)
{
int i, j;
F2D* out;
int rows, cols;
rows = in->height;
cols = in->width;
out = fMallocHandle(rows, cols);
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
subsref(out,i,j) = subsref(in,i,j);
return out;
}
Выездное массив всегда больше, чем в массиве, так что мы не должны беспокоиться о переполнении или таких. Эта функция в основном просто меняет значения двух массивов, но еще раз, потому что это так просто, я не могу полностью ее уменьшить.
И прежде чем кто-либо скажет о параллелизме, из-за размера выборки и сервера, накладные расходы, необходимые для создания потоков, фактически замедляют работу программы. Я пробовал. Поскольку эти две функции слишком короткие, не стоит создавать потоки только для их уничтожения после одной параллели.
Но для справки, да, технически это проект OpenMP, и мы должны использовать распараллеливание, но для этих двух функций это фактически замедляет работу всей программы. Я приурочил его к параллельному циклу для проверки.
EDIT: Спасибо всем, кто дал мне идеи! Сейчас у меня все работает, и теперь полная скорость!
Попробуйте поменять порядок циклов - это может повлиять на скорость попадания в кеш. – dasblinkenlight
Как определяется 'subsref'? Скорее всего, это макрос, но если это функция, убедитесь, что она встроена. Или перепишите его как макрос. –
Вам нужно указать более подробную информацию, особенно о структуре F2D и функции subsref. – betabandido