张量类,它有自己的存储,但也可以映射外部指针

Tensor class that has its own storage, but that can also map an external pointer

本文关键字:也可以 映射 指针 外部 存储 自己的 张量类      更新时间:2023-10-16

我正在设计一个张量类。现在,我想扩展它,使其也能够映射(查看)指向某个外部数据数组的指针(该数组在外部保持活动)。我目前的方法是引入一个容器(下面的m_container),并通过指针引用它(下面的m_data)。为了映射,我可以简单地让m_data指向外部,而不是指向m_container。问题是,它在我的任何一个最小的例子中都能工作,但在更大的代码中,它有时会失败(即使不使用"map">)。

我知道这是一个模糊的问题。这也是我无法理解的原因。也许这个问题对其他人来说是显而易见的?

class Foo
{
private:
double m_container[2];
double *m_data = &m_container[0];
public:
Foo(){}
double& operator[](size_t i) { return m_data[i]; }
void map(double *D) { m_data = D; }
void copy(const double *D)
{
for ( size_t i = 0 ; i < 2 ; ++i )
m_data[i] = D[i];
}
};
int main()
{
double data[2];
data[0] = 0.;
data[1] = 1.;
Foo A;
A.map(data);
}

将张量类拆分为两个类。

张量视图和张量实例。

实例可以转换为视图,但视图不能转换为实例。

现在,观点本身可以分为两种不同的类型;切片或跨度是观察者。切片可以用于编辑其元素数据源中的元素数据,而观察者不能。您可能不需要切片,应该先编写观察程序。

一旦你有了这些类型,你就可以制作只采用你在算法中需要的类型的算法。它很少是一个完整的张量实例。

你必须小心地管理所查看的所有内容的生命周期。如果你觉得这很难,而且无法轻松地做到更好(而且很难,整个语言的性能都降低了2-3倍,只是为了避免手动解决这个问题),你可以修改你的视图类型,要求共享数组数据的所有权,并将堆上的所有张量数据存储在共享指针中。这是有成本的。

相关文章: