我想将PageRank算法迁移到sgx enclave。该算法使用向量来保存边缘关系和矩阵。
vector<size_t> num_outgoing; // number of outgoing links per column
vector< vector<size_t> > rows; // the rowns of the hyperlink matrix
map<string, size_t> nodes_to_idx; // mapping from string node IDs to numeric
map<size_t, string> idx_to_nodes; // mapping from numeric node IDs to string
vector<double> pr; // the pagerank table当存储的边少于9000条时,应用程序运行良好。一旦它增加到10000或更多的边缘,应用程序就会崩溃,并抛出一个未处理的异常enter image description here。我也在enclave之外运行相同的代码,当它存储90000条边时运行得很好。
通过调试,我发现应用程序在以下位置失败。
if (rows.size() <= max_dim) {
max_dim = max_dim + 1;
rows.resize(max_dim);
if (num_outgoing.size() <= max_dim) {
num_outgoing.resize(max_dim);
}
}但是,一旦变量'rows‘拥有13896个元素,就不能将其调整得更大。我搞不懂为什么‘row’只占300kb,而'num_outgoing‘只占100kb。它远远小于允许的大小。enclave应用程序总共有128MB空间。
我的enclave配置文件如下所示。我尝试更改StackMaxSize的值,但似乎没有用。
<EnclaveConfiguration>
<ProdID>0</ProdID>
<ISVSVN>0</ISVSVN>
<StackMaxSize>0x400000</StackMaxSize>
<HeapMaxSize>0x100000</HeapMaxSize>
<TCSNum>1</TCSNum>
<TCSPolicy>1</TCSPolicy>
<DisableDebug>0</DisableDebug>
<MiscSelect>0</MiscSelect>
<MiscMask>0xFFFFFFFF</MiscMask>
<EnableKSS>0</EnableKSS>
<ISVEXTPRODID_H>0</ISVEXTPRODID_H>
<ISVEXTPRODID_L>0</ISVEXTPRODID_L>
<ISVFAMILYID_H>0</ISVFAMILYID_H>
<ISVFAMILYID_L>0</ISVFAMILYID_L>
</EnclaveConfiguration>输入边的格式如下所示。第一个数字是"from“节点,第二个数字是"to”节点
1 0
2 0
3 1
4 3
5 4
6 0
7 1
8 0
9 1
10 0我想知道如何配置enclave使其允许更大的向量变量?这个问题在win10和ubuntu上都存在。
发布于 2021-09-30 08:48:26
看起来你的内存快用完了。内存限制(堆栈和堆)是在配置文件中使用StackMaxSize和HeapMaxSize设置的(有关详细信息,请参阅Developer Reference )。EPC的大小(128MB或256MB)与其无关。在这里,您不受EPC大小的限制,而是受堆和堆栈的限制。
增加堆栈大小不会改变任何事情,因为动态分配的内存驻留在堆上。反过来,您应该查看最大堆大小。目前,您将其设置为0x100000 (=1MB),这很快就会被您的数据用完。尝试增加它,看看是否可以容纳更大的向量。
我认为在Windows上,您的enclave必须完全适合EPC,但在Linux上,您可以创建数十GB的enclave。请注意,一旦您的(Linux) enclave内存使用量超过大约90MB,您将开始注意到EPC分页,并随之而来的是性能的显著下降。
发布于 2021-09-21 12:06:02
SGX CPU(在冰岛之前)有一个有限的EPC,这是像Skylake这样的CPU的1.28M,但你也可以通过Xeon E-2200获得2.56M。这并不意味着您的应用程序不能使用更多的内存,它只是意味着硬件加速的内存范围有限。不适合EPC的页面被交换到非EPC内存(以相当大的性能成本为代价),但是这只在linux驱动程序中实现。
因此,您可以将enclave堆设置为更大的值,如2G。你将看到的是更慢的启动时间( 2G必须完全初始化),如果你的计算机的内存访问模式分散在2G范围内,那么你将看到性能极大地下降。因此,尽量将访问模式保持在本地,使用顺序/扫描等操作,这是对缓存友好计算通常要考虑的事项。
关于您的实际问题,可能是您的已分配堆即将耗尽,而该向量恰好是“最后一根稻草”。请记住,堆不仅必须包含这些数据结构,还必须包含代码本身。如果你从一些序列化的格式解析输入,那么序列化的字节可能仍然保留在内存中,如果你有其他的状态,那么也会使用内存,可能有许多无关的使用来源。如果您使用的是英特尔SDK,那么我建议您在模拟模式下进行编译,或者将您的应用程序链接到非SGX ELF中,并使用常用的内存调试工具来跟踪内存使用情况。
发布于 2021-10-07 15:21:10
尽管其他答案完全正确,但英特尔最近将内存限制提高到了1Tb,请参阅here了解更多信息。
https://stackoverflow.com/questions/69193300
复制相似问题