| // Copyright ©2015 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:generate ./single_precision.bash |
| |
| package gonum |
| |
| import ( |
| "math" |
| |
| "gonum.org/v1/gonum/internal/math32" |
| ) |
| |
| type Implementation struct{} |
| |
| // [SD]gemm behavior constants. These are kept here to keep them out of the |
| // way during single precision code genration. |
| const ( |
| blockSize = 64 // b x b matrix |
| minParBlock = 4 // minimum number of blocks needed to go parallel |
| buffMul = 4 // how big is the buffer relative to the number of workers |
| ) |
| |
| // subMul is a common type shared by [SD]gemm. |
| type subMul struct { |
| i, j int // index of block |
| } |
| |
| func max(a, b int) int { |
| if a > b { |
| return a |
| } |
| return b |
| } |
| |
| func min(a, b int) int { |
| if a > b { |
| return b |
| } |
| return a |
| } |
| |
| // blocks returns the number of divisions of the dimension length with the given |
| // block size. |
| func blocks(dim, bsize int) int { |
| return (dim + bsize - 1) / bsize |
| } |
| |
| // dcabs1 returns |real(z)|+|imag(z)|. |
| func dcabs1(z complex128) float64 { |
| return math.Abs(real(z)) + math.Abs(imag(z)) |
| } |
| |
| // scabs1 returns |real(z)|+|imag(z)|. |
| func scabs1(z complex64) float32 { |
| return math32.Abs(real(z)) + math32.Abs(imag(z)) |
| } |