将Linux的Intel x86的Intrinsic函数移植到IBM Power和ARM平台上。(4)

嗯,當創建測試框架時有一個問題。問題就是可能會重複檢查相同的值集合。如果重複檢查,則完全是浪費。因此需要一個機制來防止這種情況。還有可能由於某些錯誤只檢查相同的值。

让我们来看一下以下的源代码。

extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__,__artificial__))
_mm_add_pd (__m128d __A, __m128d __B)
{
   return (__m128d) ((__v2df)__A + (__v2df)__B);
}

__m126d是一个128位的数据类型。由于有两个__m126d,所以在这个Intrinsic函数中,所有被检查的值都可以用256位来表示。

组合的数量是巨大的,根据Intrinsic函数的不同,有时候会有512位的数据类型,那么组合的数量将变为2的1024次方,如果要创建并管理一个包含所有组合的表格将是不现实的。

那么应该怎么办呢?可以使用二叉树。例如,如果要将值1101设置为”已经检查”,则从根节点开始,沿着1 1 0 1这条分支走,将最后到达的叶子节点存储起来。

未被检查的值,因为分支中断或者叶子节点不存在,可以确认为未被检查的。在这种情况下,可以生长出新的分支和叶子,将其设为”已经检查”。

换句话说,如果要检查1024位,就需要构建一个有1024层的二叉树结构。

这种方法的优点是不需要将Intel和OpenPOWER通过Apache Kafka等相互连接,只需通过文件移动即可处理所有事务。如果需要,也可以建立相互连接来创建同步机制,但这是可选的。

或者可以使用哈希表。将输入值进行哈希运算,并将”已检查”存储在哈希表指定位置上。然后进行测试。从下一次开始,对于输入值进行哈希运算,并在哈希表上指定的位置上检查是否存在先前的”已检查”值。如果该位置已经存储了值,则与原始输入值进行比较,如果相同,则无需执行测试;如果不同,则执行测试,并从那个位置创建一个链表结构,下次开始时将从链表结构的根部进行检查。

或者,如果可以使用C#或Rust之类的编程语言,可以使用Set等数据结构来避免重复检查。Set(集合)可以管理元素而无需重复。

例如,使用专用软件创建二叉树结构的测试用例。然后,将该测试用例文件输入到Intel和OpenPOWER的专用软件中,执行测试,并使用专用软件比较Intel和OpenPOWER的测试结果。

特别感谢

林崎正行先生

广告
将在 10 秒后关闭
bannerAds