C++ 在高性能计算中,什么是更好的实践:将数据结构传递到函数或变量集?

C++ 在高性能计算中,什么是更好的实践:将数据结构传递到函数或变量集?,c++,parameter-passing,hpc,C++,Parameter Passing,Hpc,假设我有一个结构,其中包含一组描述对象的变量,在我的例子中是一个网格。我想知道,如果我有一个只使用网格子集的函数,下面的计算内核函数的两个变体是否有性能差异。内核是相同的,只是传递结构的内核必须先从结构中提取itot、jtot和ktot,然后才能进行大量计算 struct Grid { int itot; int jtot; int ktot; int not_used_in_kernel1; int not_used_in_kernel2; i

假设我有一个结构,其中包含一组描述对象的变量,在我的例子中是一个网格。我想知道,如果我有一个只使用网格子集的函数,下面的
计算内核
函数的两个变体是否有性能差异。内核是相同的,只是传递结构的内核必须先从结构中提取
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);

我认为传递一个结构对代码维护更有利。如果向网格中添加新字段,只需更改函数即可。但是,传递一组变量时,您必须更改函数和对函数的每次调用。

我认为传递一个结构更利于代码维护。如果向网格中添加新字段,只需更改函数即可。但是,传递一组变量时,您必须更改函数和对函数的每次调用。

我认为传递一个结构更利于代码维护。如果向网格中添加新字段,只需更改函数即可。但是,传递一组变量时,您必须更改函数和对函数的每次调用。

我认为传递一个结构更利于代码维护。如果向网格中添加新字段,只需更改函数即可。但是,传递一组变量时,您必须更改函数和对函数的每次调用。

我想说,在第二个变量中传递对结构的引用可能更有效。在第一个变量上,调用者需要在堆栈上推送3个int变量,而在第二个变量上,调用者只需推送一个指向结构的引用(指针)并在那里执行操作。当然,如果要传递的变量超过3个,那么对性能的影响会更大。

我想说,在第二个变量中传递对结构的引用可能更有效。在第一个变量上,调用者需要在堆栈上推送3个int变量,而在第二个变量上,调用者只需推送一个指向结构的引用(指针)并在那里执行操作。当然,如果要传递的变量超过3个,那么对性能的影响会更大。

我想说,在第二个变量中传递对结构的引用可能更有效。在第一个变量上,调用者需要在堆栈上推送3个int变量,而在第二个变量上,调用者只需推送一个指向结构的引用(指针)并在那里执行操作。当然,如果要传递的变量超过3个,那么对性能的影响会更大。

我想说,在第二个变量中传递对结构的引用可能更有效。在第一个变量上,调用者需要在堆栈上推送3个int变量,而在第二个变量上,调用者只需推送一个指向结构的引用(指针)并在那里执行操作。当然,如果要传递的变量超过3个,则性能影响会更大。

如果
计算内核
是一个在内部执行大量工作并被调用几次的函数,则两个版本之间的差异非常小。第二个版本只需要解引用3个值的额外成本,而其他版本都是相同的,并且您可能必须在调用第一个版本之前进行这样的解引用


出于紧凑的原因,我肯定会使用第二种形式:如果定义面向对象的数据结构,那么就以这种方式使用它们(更好的封装)。第二个版本只需要解引用3个值的额外成本,而其他版本都是相同的,并且您可能必须在调用第一个版本之前进行这样的解引用


出于紧凑的原因,我肯定会使用第二种形式:如果定义面向对象的数据结构,那么就以这种方式使用它们(更好的封装)。第二个版本只需要解引用3个值的额外成本,而其他版本都是相同的,并且您可能必须在调用第一个版本之前进行这样的解引用


出于紧凑的原因,我肯定会使用第二种形式:如果定义面向对象的数据结构,那么就以这种方式使用它们(更好的封装)。第二个版本只需要解引用3个值的额外成本,而其他版本都是相同的,并且您可能必须在调用第一个版本之前进行这样的解引用


出于紧凑性的原因,我肯定会使用第二种形式:如果您定义面向对象的数据结构,那么就以这种方式使用它们(更好的封装)。

您进行过基准测试吗?这在很大程度上取决于编译器、编译器版本、优化标志、CPU模型和体系结构,可能还有其他因素。此外,从技术上讲,在第二个版本中,你没有传递一个结构,你传递的是一个对结构的引用。@Ginden我没有对它进行基准测试,我只是好奇,如果你只使用一个复杂结构中的几个变量,那么取消对该结构的引用是否会有成本。你进行过基准测试吗?这在很大程度上取决于编译器、编译器版本、优化标志、CPU模型和体系结构,以及