예제 #1
0
func distsq(x, y []simd.I32x4) int32 {
	if len(x) != len(y) {
		return -1
	}
	n := len(x)
	dist := int32(math.MaxInt32)
	for i := 0; i < n; i++ {
		for j := 0; j < n; j++ {

			if i == j {
				continue
			}
			dx := simd.SubI32x4(x[j], x[i])
			dy := simd.SubI32x4(y[j], y[i])
			sqX := simd.MulI32x4(dx, dx)
			sqY := simd.MulI32x4(dy, dy)
			sqDist := simd.AddI32x4(sqX, sqY)
			if sqDist[0] < dist {
				dist = sqDist[0]
			}
			if sqDist[1] < dist {
				dist = sqDist[1]
			}
			if sqDist[2] < dist {
				dist = sqDist[2]
			}
			if sqDist[3] < dist {
				dist = sqDist[3]
			}

		}
	}
	return dist
}
예제 #2
0
func regression1Simd(x, y []simd.I32x4) int32 {
	if len(x) != len(y) {
		return -1
	}
	dist := int32(math.MaxInt32)
	i := 0
	j := 1
	dx := simd.SubI32x4(x[j], x[i])
	dy := simd.SubI32x4(y[j], y[i])
	sqX := simd.MulI32x4(dx, dx)
	sqY := simd.MulI32x4(dy, dy)
	sqDist := simd.AddI32x4(sqX, sqY)
	dy2 := simd.SubI32x4(sqX, sqY)
	dist = sqDist[0] + dy2[2]
	return dist
}
예제 #3
0
func regspillsRef(x, y []simd.I32x4) int32 {
	if len(x) != len(y) {
		return -1
	}
	dist := int32(math.MaxInt32)
	i := 0
	j := 1
	dx := simd.SubI32x4(x[j], x[i])
	dy := simd.SubI32x4(y[j], y[i])
	sqX := simd.MulI32x4(dx, dx)
	sqY := simd.MulI32x4(dy, dy)
	sqDist := simd.AddI32x4(sqX, sqY)
	dx2 := simd.SubI32x4(dx, dy)

	dy2 := simd.SubI32x4(sqX, sqY)
	sqX2 := simd.MulI32x4(dx2, dx2)
	sqY2 := simd.MulI32x4(dy2, dy2)
	sqDist2 := simd.AddI32x4(sqX2, sqY2)
	dx3 := simd.SubI32x4(dx2, dy2)
	dy3 := simd.SubI32x4(sqX2, sqY2)
	sqX3 := simd.MulI32x4(dx3, dx3)
	sqY3 := simd.MulI32x4(dy3, dy3)
	sqDist3 := simd.AddI32x4(sqX3, sqY3)
	t := dx[0] + dx[1] + dx[2] + dx[3] +
		dx2[0] + dx2[1] + dx2[2] + dx2[3] +
		dx3[0] + dx3[1] + dx3[2] + dx3[3]
	v := dy[0] + dy[1] + dy[2] + dy[3] +
		dy2[0] + dy2[1] + dy2[2] + dy2[3] +
		dy3[0] + dy3[1] + dy3[2] + dy3[3]
	dist = t + v + sqDist[0] + sqDist2[1] + sqDist3[2]
	return dist
}
예제 #4
0
func subi32x4(x, y simd.I32x4) simd.I32x4           { return simd.SubI32x4(x, y) }
예제 #5
0
func main() {

	count := 0
	rand.Seed(42)
	errors := 0
	for i := -63; i <= 63; i++ {

		a := int(0)
		if i < 0 {
			a = -1 << uint(-i)
		} else {
			a = 1<<uint(i) - 1
		}

		for j := -63; j <= 63; j++ {

			count++

			b := int(0)
			if j < 0 {
				b = -1 << uint(-j)
			} else {
				b = 1<<uint(j) - 1
			}

			shift := uint8(j)

			var xI32x4 simd.I32x4
			var yI32x4 simd.I32x4

			var xF32x4 simd.F32x4
			var yF32x4 simd.F32x4

			for idx := 0; idx < 4; idx++ {
				abs_a := a

				if abs_a == math.MinInt64 || abs_a == 0 {
					abs_a = 64
				}
				if abs_a < 0 {
					abs_a = -abs_a
				}
				abs_b := b
				if abs_b == math.MinInt64 || abs_b == 0 {
					abs_b = 64
				}
				if abs_b < 0 {
					abs_b = -abs_b
				}

				xI32x4[idx] = int32(rand.Intn(abs_a))
				yI32x4[idx] = int32(rand.Intn(abs_b))
				xF32x4[idx] = rand.Float32()
				yF32x4[idx] = rand.Float32()
			}

			if addi32x4(xI32x4, yI32x4) != simd.AddI32x4(xI32x4, yI32x4) {
				fmt.Printf("addi32x4(%v, %v)\n", xI32x4, yI32x4)
				fmt.Println("x:", xI32x4)
				fmt.Println("y:", yI32x4)
				fmt.Println("s(xI32x4, yI32x4):", addi32x4(xI32x4, yI32x4))
				fmt.Println(" (xI32x4, yI32x4):", simd.AddI32x4(xI32x4, yI32x4))
				errors++
			}
			if subi32x4(xI32x4, yI32x4) != simd.SubI32x4(xI32x4, yI32x4) {
				fmt.Printf("subi32x4(%v, %v)\n", xI32x4, yI32x4)
				fmt.Println("x:", xI32x4)
				fmt.Println("y:", yI32x4)
				fmt.Println("s:", subi32x4(xI32x4, yI32x4))
				fmt.Println(" :", simd.SubI32x4(xI32x4, yI32x4))
				errors++
			}
			if muli32x4(xI32x4, yI32x4) != simd.MulI32x4(xI32x4, yI32x4) {
				fmt.Printf("muli32x4(%v, %v)\n", xI32x4, yI32x4)
				fmt.Println("x:", xI32x4)
				fmt.Println("y:", yI32x4)
				fmt.Println("s:", muli32x4(xI32x4, yI32x4))
				fmt.Println(" :", simd.MulI32x4(xI32x4, yI32x4))
				errors++
			}
			if shli32x4(xI32x4, shift) != simd.ShlI32x4(xI32x4, shift) {
				fmt.Printf("shli32x4(%v, %v)\n", xI32x4, shift)
				fmt.Println("x:", xI32x4)
				fmt.Println("shift:", shift)
				fmt.Println("s:", shli32x4(xI32x4, shift))
				fmt.Println(" :", simd.ShlI32x4(xI32x4, shift))
				errors++
			}
			if shri32x4(xI32x4, shift) != simd.ShrI32x4(xI32x4, shift) {
				fmt.Printf("shri32x4(%v, %v)\n", xI32x4, shift)
				fmt.Println("x:", xI32x4)
				fmt.Println("shift:", shift)
				fmt.Println("s:", shri32x4(xI32x4, shift))
				fmt.Println(" :", simd.ShrI32x4(xI32x4, shift))
				errors++
			}

			if addf32x4(xF32x4, yF32x4) != simd.AddF32x4(xF32x4, yF32x4) {
				fmt.Printf("addf32x4(%v, %v)\n", xF32x4, yF32x4)
				fmt.Println("x:", xF32x4)
				fmt.Println("y:", yF32x4)
				fmt.Println("s:", addf32x4(xF32x4, yF32x4))
				fmt.Println(" :", simd.AddF32x4(xF32x4, yF32x4))
				errors++
			}
			if subf32x4(xF32x4, yF32x4) != simd.SubF32x4(xF32x4, yF32x4) {
				fmt.Printf("subf32x4(%v, %v)\n", xF32x4, yF32x4)
				fmt.Println("x:", xF32x4)
				fmt.Println("y:", yF32x4)
				fmt.Println("s:", subf32x4(xF32x4, yF32x4))
				fmt.Println(" :", simd.SubF32x4(xF32x4, yF32x4))
				errors++
			}
			if mulf32x4(xF32x4, yF32x4) != simd.MulF32x4(xF32x4, yF32x4) {
				fmt.Printf("mulf32x4(%v, %v)\n", xF32x4, yF32x4)
				fmt.Println("x:", xF32x4)
				fmt.Println("y:", yF32x4)
				fmt.Println("s:", mulf32x4(xF32x4, yF32x4))
				fmt.Println(" :", simd.MulF32x4(xF32x4, yF32x4))
			}
			if divf32x4(xF32x4, yF32x4) != simd.DivF32x4(xF32x4, yF32x4) {
				fmt.Printf("divf32x4(%v, %v)\n", xF32x4, yF32x4)
				fmt.Println("x:", xF32x4)
				fmt.Println("y:", yF32x4)
				fmt.Println("s:", divf32x4(xF32x4, yF32x4))
				fmt.Println(" :", simd.DivF32x4(xF32x4, yF32x4))
				errors++
			}

		}
	}

	fmt.Printf("Done, errors: %d\n", errors)
}