Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

[BUG] munmap_chunk(): invalid pointer

Abierto
#381 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
25/100
Tipo de issue
Error
Claridad
Necesita aclaración
Estado de actividad
Estancado
Stack tecnológico
rust
Área
backend

Línea de trabajo

Comienza reproduciendo el programa de larga ejecución con el backend de OpenCL usando AF_TRACE=all y AF_PRINT_ERRORS=1. Inspecciona las rutas referenciadas src/backend/opencl/jit.cpp y src/backend/opencl/Kernel.hpp alrededor de los lanzamientos de kernels registrados y confirma que el fallo de puntero no válido ya no se produce.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Bug

Description

  1. I installed ArrayFire using AUR
  2. I am experiencing this on OpenCL
  3. No, I do not have a workaround.
  4. The bug can be reproduced if the program is left running for a long enough time. However, the exact time that it happens tends to be random.
  5. Most Recent Console Output:
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [25,256,1,1] Global: [32,256,1] Local: [32,1,1] threads: 8192
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [25,256,1,1] Global: [32,256,1] Local: [32,1,1] threads: 8192
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [1,1,1,1] Global: [128,1,1] Local: [128,1,1] threads: 128
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching memCopy
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [1,1,1,1] Global: [128,1,1] Local: [128,1,1] threads: 128
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [1,1,1,1] Global: [128,1,1] Local: [128,1,1] threads: 128
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,1,1,1] Global: [256,1,1] Local: [128,1,1] threads: 256
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [25,256,1,1] Global: [32,256,1] Local: [32,1,1] threads: 8192
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [25,256,1,1] Global: [32,256,1] Local: [32,1,1] threads: 8192
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [25,256,1,1] Global: [32,256,1] Local: [32,1,1] threads: 8192
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2965] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [25,256,1,1] Global: [32,256,1] Local: [32,1,1] threads: 8192
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,256,1,1] Global: [256,128,1] Local: [128,1,1] threads: 32768
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching identity_kernel
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [65536,1,1,1] Global: [65536,1,1] Local: [128,1,1] threads: 65536
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,256,1,1] Global: [256,128,1] Local: [128,1,1] threads: 32768
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [65536,1,1,1] Global: [65536,1,1] Local: [128,1,1] threads: 65536
[kernel][1736790336][2966] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [65536,1,1,1] Global: [65536,1,1] Local: [128,1,1] threads: 65536
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [25,256,1,1] Global: [32,256,1] Local: [32,1,1] threads: 8192
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [256,256,1,1] Global: [256,128,1] Local: [128,1,1] threads: 32768
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching reduce_first_kernel
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching philoxGenerator
[kernel][1736790336][2967] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/jit.cpp:469 ] Launching : Dims: [6400,1,1,1] Global: [6400,1,1] Local: [128,1,1] threads: 6400
munmap_chunk(): invalid pointer
[kernel][1736790336][2968] [ /usr/src/debug/arrayfire/arrayfire-full-3.8.3/src/backend/opencl/Kernel.hpp:34 ] Launching identity_kernel
Aborted (core dumped)

Reproducible Code and/or Steps

This is what I believe might be causing the bug, but I am not exactly sure. Let me know if the full source code is needed.

/// A probabilistic implementation of the STDP algorithm for a bitwise linear layer.
pub fn probabilistic_bitwise_stdp<I: BitVolume, O: BitVolume>(
    synaptic_layers:              &mut [BitwiseLinear<I, O>],
    self_connected:               bool,
    presynaptic_trace:            &af::Array<f32>,
    dominant_postsynaptic_spikes: &af::Array<bool>,
    dopamine:                     f32,
    alpha:                        f32,
    learning_rate:                f32
    ) {

    // TODO:
    // When arrayfire supports 8-bit signed integers, migrate to that instead of 16-bit integers.

    // Go through each synaptic layer and modify its weights.
    let connections: usize = synaptic_layers.len();
    for (layer_idx, layer) in synaptic_layers.iter_mut().enumerate() {

        // Get the excitatory and inhibitory weights, and convert it to a trinary layer.
        let (excitatory, inhibitory): (af::Array<bool>, af::Array<bool>) = layer.weights_as_array();

        let mut weights: af::Array<i16> = af::constant(0, excitatory.dims());
                weights                 = af::selectl( 1.0, &excitatory, &weights);
                weights                 = af::selectl(-1.0, &inhibitory, &weights);

        // Normalize the trace and compute the LTP and LTD components.
        let trace_norm: af::Array<f32> = if connections == 1 {
            presynaptic_trace / af::max_all(presynaptic_trace).0
        } else {
            let sequences:   &[af::Seq<i32>] = &[af::Seq::default(), af::Seq::default(), af::Seq::default(), af::Seq::new(layer_idx as i32, layer_idx as i32, 1)];
            let trace_layer: af::Array<f32>  = af::index(presynaptic_trace, sequences);

            &trace_layer / af::max_all(&trace_layer).0
        };

        let ltp_trace: af::Array<f32> = af::exp(&trace_norm) - alpha;
        let ltd_trace: af::Array<f32> = af::exp(&(1.0f32 - &trace_norm)) - alpha;

        // Calculate update probabilities.
        let p_update_prob: af::Array<f32> = (ltp_trace - ltd_trace) * learning_rate * dopamine;
        let n_update_prob: af::Array<f32> = &p_update_prob * -1f32;

        // Generate random values for probabilistic update.
        // We use a uniform distribution to have an equal chance for all values to be generated.
        //
        // Using the random values, we'll then create a mask for different weight updates (positive and
        // negative).
        let random_values: af::Array<f32> = af::randu(weights.dims());

        let increase_mask: af::Array<bool> = af::lt(&random_values, &p_update_prob, false) & af::lt(&weights, & 1i16, false);
        let decrease_mask: af::Array<bool> = af::lt(&random_values, &n_update_prob, false) & af::gt(&weights, &-1i16, false);

        // Calculate delta weights
        let delta_weights: af::Array<i16> = increase_mask.cast::<i16>() - decrease_mask.cast::<i16>();

        // Apply winner_mask and identity_mask to delta_weights.
        let winner_mask:          af::Array<bool> = af::tile(&dominant_postsynaptic_spikes, af::dim4!(1, I::FSIZE as u64, 1, 1));
        let masked_delta_weights: af::Array<i16>  = if self_connected {
            let identity_mask: af::Array<i16> = (1f32 - af::identity::<i16>(af::dim4!(1, I::FSIZE as u64, O::FSIZE as u64, 1))).cast();

            &delta_weights 
                * &winner_mask.cast::<i16>() 
                * &identity_mask
        } else {
            &delta_weights
                * &winner_mask.cast::<i16>()
        };

        // Apply the masked delta weights to the weights.
        weights += masked_delta_weights;
        weights  = af::clamp(&weights, &-1i16, &1i16, true);

        // Deconstruct the weights back into their excitatory and inhibitory counterparts and export it
        // back into the layer.
        let excitatory: af::Array<bool> = af::eq(&weights, & 1, false);
        let inhibitory: af::Array<bool> = af::eq(&weights, &-1, false);

        layer.update_weights(excitatory, inhibitory);
    }
}
    /// Returns the weights as an arrayfire array of the dimensions (1, input size, output size).
    /// Arrays are returned in the order of excitatory and inhibitory weights.
    pub fn weights_as_array(&self) -> (af::Array<bool>, af::Array<bool>) {
        (
            af::Array::new(
                &self.neurons.par_iter()
                    .flat_map(|neuron| neuron.weight_excitatory.to_flattened_bits())
                    .collect::<Vec<_>>(),
                af::dim4!(1, I::FSIZE as u64, O::FSIZE as u64)
            ),
            af::Array::new(
                &self.neurons.par_iter()
                    .flat_map(|neuron| neuron.weight_inhibitory.to_flattened_bits())
                    .collect::<Vec<_>>(),
                af::dim4!(1, I::FSIZE as u64, O::FSIZE as u64)
            )
        )
    }

    /// Updates the weights from an arrayfire array of the dimensions (input size, output size).
    pub fn update_weights(&mut self, updated_excitatory: af::Array<bool>, updated_inhibitory: af::Array<bool>) {
        let mut excitatory_weights: Vec<bool> = vec![false; (I::FSIZE * O::FSIZE) as usize];
        let mut inhibitory_weights: Vec<bool> = vec![false; (I::FSIZE * O::FSIZE) as usize];

        updated_excitatory.host(&mut excitatory_weights);
        updated_inhibitory.host(&mut inhibitory_weights);

        self.neurons.par_iter_mut().enumerate().for_each(|(i, neuron)| {
            let start: usize = i     * I::FSIZE as usize;
            let end:   usize = start + I::FSIZE as usize;

            let excitatory_slice: &[bool] = &excitatory_weights[start..end];
            let inhibitory_slice: &[bool] = &inhibitory_weights[start..end];

            neuron.weight_excitatory = I::from_flattened_bits(excitatory_slice).unwrap();
            neuron.weight_inhibitory = I::from_flattened_bits(inhibitory_slice).unwrap();
        });
    }

System Information

  1. Arrayfire 3.8.3
  2. I have an NVidia 3050 RTX laptop GPU
  3. Output as follows:
LSB Version:	n/a
Distributor ID:	Arch
Description:	Arch Linux
Release:	rolling
Codename:	n/a
name, memory.total [MiB], driver_version
NVIDIA GeForce RTX 3050 Laptop GPU, 4096 MiB, 565.57.01
rocm-smi not found.
clinfo not found.

Checklist

  • Using the latest available ArrayFire release
  • GPU drivers are up to date
Lenguaje dominante
Rust
Estrellas
827
Forks
59
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de arrayfire/arrayfire-rust

Todos los issues de arrayfire/arrayfire-rust

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.