Что является лучшей практикой в ​​высокопроизводительных вычислениях: передача структуры данных в функцию или набор переменных?

Представьте, что у меня есть структура, которая содержит набор переменных, которые описывают объект, который в моем случае является сеткой. Мне было интересно, если у меня есть функция, которая использует только подмножество сетки, есть ли какие-либо различия в производительности в двух вариантах computational_kernel функции ниже. Ядра одинаковы, за исключением того, что ядро, в котором передается структура, должно извлечь itot, jtot а также ktot от структуры до тяжелых вычислений.

struct Grid
{
int itot;
int jtot;
int ktot;

int not_used_in_kernel1;
int not_used_in_kernel2;
int not_used_in_kernel3;
int not_used_in_kernel4;
}
Grid grid;

// Code that initializes the grid values...

// Variant 1
computational_kernel(double* array1, double* array2,
const int itot, const int jtot, const int ktot);

// Variant 2
computational_kernel(double* array1, double* array2,
const Grid& grid);

0

Решение

Если computational_kernel это функция, которая выполняет много работы внутри и вызывается несколько раз, разница между двумя версиями бесконечно мала. Вторая версия имеет только дополнительную стоимость разыменования 3 значения, чем остальные идентичны, и вам, вероятно, придется делать такую ​​разыменование в любом случае, прежде чем вызывать первую версию.

Я бы определенно использовал вторую форму по соображениям компактности: если вы определяете объектно-ориентированные структуры данных, используйте их таким образом (лучше инкапсуляция).

1

Другие решения

Я думаю, что передача структуры лучше для поддержки кода. если вы добавите новые поля в свою сетку, вам нужно будет только изменить функцию. Но, передавая набор переменных, вы должны будете изменить функцию и каждый вызов функции.

2

Я бы сказал, что передача ссылки на структуру, как во втором варианте, вероятно, будет более эффективной с точки зрения производительности. В первом варианте вызывающей стороне необходимо поместить 3 переменные типа int в стек, в то время как во втором варианте все, что ему нужно, — это ссылка (указатель) на структуру и выполнить всю работу там. Влияние на производительность, конечно, больше, если вам нужно передать более 3 переменных.

0