Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/complete-agi-core / generator_core/pkg/gpu/cuda_stub.go |
| Date | Not specified in source |
| Repository | Janady13/complete-agi-core |
| Revision | 33aa84f2aa61cedbe010240ada7f4efbdfe795a7 |
| Branch | claude/improve-math-logic-ehIW1 |
| Path or archive member | generator_core/pkg/gpu/cuda_stub.go |
| Original SHA-256 | 93379f383c776a5b2475dee6fc4163faeaa4a97876dc9edee90d7885db831a4b |
| Git blob SHA | 41ce5b86164020927d1fe7865a2d48f2345e38f4 |
| Reading-copy SHA-256 | 93379f383c776a5b2475dee6fc4163faeaa4a97876dc9edee90d7885db831a4b |
Recovered source transcript
Download complete source text ↓427 lines · 9.5 KB
// Package gpu provides GPU acceleration for generator operations.
//
// This is a stub implementation that provides the interface and CPU fallback.
// Full CUDA implementation would use cgo with CUDA libraries.
//
// Features:
// - Batched matrix operations
// - Parallel generator forward pass
// - Gradient computation on GPU
package gpu
import (
"math"
"runtime"
"sync"
)
//=============================================================================
// GPU DEVICE MANAGEMENT
//=============================================================================
// Device represents a GPU device
type Device struct {
ID int
Name string
Memory int64 // bytes
Cores int
Available bool
}
// DeviceManager manages GPU devices
type DeviceManager struct {
mu sync.RWMutex
devices []Device
selected int
}
// NewDeviceManager creates a new device manager
func NewDeviceManager() *DeviceManager {
dm := &DeviceManager{
devices: make([]Device, 0),
selected: -1,
}
dm.detectDevices()
return dm
}
func (dm *DeviceManager) detectDevices() {
// Stub: Add CPU as fallback "device"
dm.devices = append(dm.devices, Device{
ID: 0,
Name: "CPU Fallback",
Memory: 8 * 1024 * 1024 * 1024, // 8GB
Cores: runtime.NumCPU(),
Available: true,
})
// TODO: Add CUDA device detection via cgo
// #include <cuda_runtime.h>
// cudaGetDeviceCount(&count)
}
// GetDevices returns available devices
func (dm *DeviceManager) GetDevices() []Device {
dm.mu.RLock()
defer dm.mu.RUnlock()
return dm.devices
}
// SelectDevice selects a device for computation
func (dm *DeviceManager) SelectDevice(id int) bool {
dm.mu.Lock()
defer dm.mu.Unlock()
for i, d := range dm.devices {
if d.ID == id && d.Available {
dm.selected = i
return true
}
}
return false
}
//=============================================================================
// GPU TENSOR
//=============================================================================
// Tensor represents data on GPU (or CPU fallback)
type Tensor struct {
Data []float32
Shape []int
Strides []int
OnGPU bool
}
// NewTensor creates a new tensor
func NewTensor(shape ...int) *Tensor {
size := 1
for _, s := range shape {
size *= s
}
strides := make([]int, len(shape))
stride := 1
for i := len(shape) - 1; i >= 0; i-- {
strides[i] = stride
stride *= shape[i]
}
return &Tensor{
Data: make([]float32, size),
Shape: shape,
Strides: strides,
OnGPU: false,
}
}
// Size returns total number of elements
func (t *Tensor) Size() int {
size := 1
for _, s := range t.Shape {
size *= s
}
return size
}
// ToGPU transfers tensor to GPU
func (t *Tensor) ToGPU() {
// Stub: In real implementation, would call cudaMemcpy
t.OnGPU = true
}
// ToCPU transfers tensor to CPU
func (t *Tensor) ToCPU() {
t.OnGPU = false
}
// Fill fills tensor with value
func (t *Tensor) Fill(val float32) {
for i := range t.Data {
t.Data[i] = val
}
}
//=============================================================================
// GPU OPERATIONS (CPU Fallback)
//=============================================================================
// Ops provides GPU-accelerated operations
type Ops struct {
numWorkers int
}
// NewOps creates new GPU operations handler
func NewOps() *Ops {
return &Ops{
numWorkers: runtime.NumCPU(),
}
}
// MatMul performs matrix multiplication: C = A @ B
func (ops *Ops) MatMul(A, B, C *Tensor) {
// A: [M, K], B: [K, N], C: [M, N]
if len(A.Shape) != 2 || len(B.Shape) != 2 {
return
}
M := A.Shape[0]
K := A.Shape[1]
N := B.Shape[1]
// Parallel matmul
var wg sync.WaitGroup
rowsPerWorker := (M + ops.numWorkers - 1) / ops.numWorkers
for w := 0; w < ops.numWorkers; w++ {
startRow := w * rowsPerWorker
endRow := startRow + rowsPerWorker
if endRow > M {
endRow = M
}
if startRow >= M {
break
}
wg.Add(1)
go func(start, end int) {
defer wg.Done()
for i := start; i < end; i++ {
for j := 0; j < N; j++ {
sum := float32(0)
for k := 0; k < K; k++ {
sum += A.Data[i*K+k] * B.Data[k*N+j]
}
C.Data[i*N+j] = sum
}
}
}(startRow, endRow)
}
wg.Wait()
}
// BatchMatMul performs batched matrix multiplication
func (ops *Ops) BatchMatMul(A, B, C *Tensor, batchSize int) {
// A: [B, M, K], B: [B, K, N], C: [B, M, N]
if len(A.Shape) != 3 {
return
}
M := A.Shape[1]
K := A.Shape[2]
N := B.Shape[2]
matrixSizeA := M * K
matrixSizeB := K * N
matrixSizeC := M * N
var wg sync.WaitGroup
for b := 0; b < batchSize; b++ {
wg.Add(1)
go func(batch int) {
defer wg.Done()
offsetA := batch * matrixSizeA
offsetB := batch * matrixSizeB
offsetC := batch * matrixSizeC
for i := 0; i < M; i++ {
for j := 0; j < N; j++ {
sum := float32(0)
for k := 0; k < K; k++ {
sum += A.Data[offsetA+i*K+k] * B.Data[offsetB+k*N+j]
}
C.Data[offsetC+i*N+j] = sum
}
}
}(b)
}
wg.Wait()
}
// Softmax applies softmax along last dimension
func (ops *Ops) Softmax(input, output *Tensor, temperature float32) {
size := input.Size()
lastDim := input.Shape[len(input.Shape)-1]
numVectors := size / lastDim
var wg sync.WaitGroup
for v := 0; v < numVectors; v++ {
wg.Add(1)
go func(vec int) {
defer wg.Done()
offset := vec * lastDim
// Find max for numerical stability
maxVal := input.Data[offset]
for i := 1; i < lastDim; i++ {
if input.Data[offset+i] > maxVal {
maxVal = input.Data[offset+i]
}
}
// Compute exp and sum
sum := float32(0)
for i := 0; i < lastDim; i++ {
output.Data[offset+i] = float32(math.Exp(float64((input.Data[offset+i] - maxVal) / temperature)))
sum += output.Data[offset+i]
}
// Normalize
for i := 0; i < lastDim; i++ {
output.Data[offset+i] /= sum
}
}(v)
}
wg.Wait()
}
// ReLU applies ReLU activation
func (ops *Ops) ReLU(input, output *Tensor) {
size := input.Size()
for i := 0; i < size; i++ {
if input.Data[i] > 0 {
output.Data[i] = input.Data[i]
} else {
output.Data[i] = 0
}
}
}
// Sigmoid applies sigmoid activation
func (ops *Ops) Sigmoid(input, output *Tensor) {
size := input.Size()
for i := 0; i < size; i++ {
output.Data[i] = float32(1.0 / (1.0 + math.Exp(-float64(input.Data[i]))))
}
}
// ComputePhi computes consciousness metric for tensor
func (ops *Ops) ComputePhi(input *Tensor) float32 {
size := input.Size()
if size == 0 {
return 0.5
}
sum := float32(0)
for i := 0; i < size; i++ {
sum += input.Data[i]
}
mean := sum / float32(size)
return float32(1.0 / (1.0 + math.Abs(float64(mean-1.0))))
}
// Add element-wise addition: C = A + B
func (ops *Ops) Add(A, B, C *Tensor) {
size := A.Size()
for i := 0; i < size; i++ {
C.Data[i] = A.Data[i] + B.Data[i]
}
}
// Scale multiplies tensor by scalar
func (ops *Ops) Scale(input *Tensor, scalar float32, output *Tensor) {
size := input.Size()
for i := 0; i < size; i++ {
output.Data[i] = input.Data[i] * scalar
}
}
//=============================================================================
// GENERATOR BATCH PROCESSING
//=============================================================================
// BatchForward processes multiple inputs through generators in parallel
type BatchForward struct {
ops *Ops
batchSize int
inputDim int
outputDim int
numLayers int
weights []*Tensor
biases []*Tensor
activations []*Tensor
}
// NewBatchForward creates a new batch processor
func NewBatchForward(batchSize, inputDim, outputDim, numLayers int) *BatchForward {
bf := &BatchForward{
ops: NewOps(),
batchSize: batchSize,
inputDim: inputDim,
outputDim: outputDim,
numLayers: numLayers,
weights: make([]*Tensor, numLayers),
biases: make([]*Tensor, numLayers),
activations: make([]*Tensor, numLayers+1),
}
// Initialize layers
dims := []int{inputDim}
hiddenDim := (inputDim + outputDim) / 2
for i := 0; i < numLayers-1; i++ {
dims = append(dims, hiddenDim)
}
dims = append(dims, outputDim)
for i := 0; i < numLayers; i++ {
bf.weights[i] = NewTensor(dims[i], dims[i+1])
bf.biases[i] = NewTensor(dims[i+1])
bf.activations[i] = NewTensor(batchSize, dims[i])
// Xavier initialization
scale := float32(math.Sqrt(2.0 / float64(dims[i]+dims[i+1])))
for j := range bf.weights[i].Data {
bf.weights[i].Data[j] = (float32(j%1000)/500 - 1) * scale
}
}
bf.activations[numLayers] = NewTensor(batchSize, dims[numLayers])
return bf
}
// Forward performs forward pass for a batch
func (bf *BatchForward) Forward(input *Tensor) *Tensor {
// Copy input to first activation
copy(bf.activations[0].Data, input.Data)
// Forward through layers
for l := 0; l < bf.numLayers; l++ {
// Linear: A[l+1] = A[l] @ W[l] + b[l]
bf.ops.MatMul(bf.activations[l], bf.weights[l], bf.activations[l+1])
// Add bias (broadcast)
outDim := bf.biases[l].Shape[0]
for b := 0; b < bf.batchSize; b++ {
for j := 0; j < outDim; j++ {
bf.activations[l+1].Data[b*outDim+j] += bf.biases[l].Data[j]
}
}
// Activation (ReLU for hidden, sigmoid for output)
if l < bf.numLayers-1 {
bf.ops.ReLU(bf.activations[l+1], bf.activations[l+1])
} else {
bf.ops.Sigmoid(bf.activations[l+1], bf.activations[l+1])
}
}
return bf.activations[bf.numLayers]
}
// ComputeBatchPhi computes phi for each item in batch
func (bf *BatchForward) ComputeBatchPhi(output *Tensor) []float32 {
phis := make([]float32, bf.batchSize)
outDim := bf.outputDim
for b := 0; b < bf.batchSize; b++ {
sum := float32(0)
for j := 0; j < outDim; j++ {
sum += output.Data[b*outDim+j]
}
mean := sum / float32(outDim)
phis[b] = float32(1.0 / (1.0 + math.Abs(float64(mean-1.0))))
}
return phis
}
Mathematical records from this source
010203
func NewOps() *Ops · MatMul performs matrix multiplication: C
This relation defines MatMul performs matrix multiplication: C in the source section “func NewOps() *Ops · MatMul performs matrix multiplication: C”. It specifies the displayed…
func (ops *Ops) ComputePhi(input *Tensor) float32 · Add element-wise addition: C
This relation defines Add element-wise addition: C in the source section “func (ops *Ops) ComputePhi(input *Tensor) float32 · Add element-wise addition: C”. It specifies the…
func (bf *BatchForward) Forward(input *Tensor) *Tensor · Linear: A[l+1]
This relation defines Linear: A[l+1] in the source section “func (bf *BatchForward) Forward(input *Tensor) *Tensor · Linear: A[l+1]”. It specifies the displayed relationship…