示例#1
0
 public ShiftsStorage(Options.CalibrationMode mode, bool for_testing)
 {
     calibration_mode = mode;
     DefaultPath      = GetFilepath(Helpers.UserDataFolder);
     this.cache       = new ShiftStorageCache(mode);
     if (!for_testing)
     {
         LoadFromFile();
     }
 }
示例#2
0
        // This function is static to move all used class fields from heap to stack.
        // Doing so improves perf test results.
        private static void FindDistancesFromCursor_SIMD(ShiftStorageCache cache)
        {
            int vector_size       = System.Numerics.Vector <float> .Count;
            int vectors_per_point = AlignedCoordinatesCount / vector_size;

            float[] cached_data                     = cache.cached_data;
            float[] distances                       = cache.cached_distances;
            int[]   distance_mask                   = cache.distance_mask;
            float[] cursor_coordinates              = cache.cursor_coordinates;
            float   distance_mask_treshold          = cache.distance_mask_treshold;
            int     subtract_results_starting_index = cache.subtract_results_starting_index;
            int     number_of_shift_positions       = cache.number_of_shift_positions;

            int subtract_iterator           = 0;
            int number_of_considered_points = Math.Min(cache.mode.considered_zones_count, number_of_shift_positions);

            System.Numerics.Vector <float>[] cursor_position = new System.Numerics.Vector <float> [vectors_per_point];
            int i = 0;

            for (i = 0; i < vectors_per_point; ++i)
            {
                cursor_position[i] = new System.Numerics.Vector <float>(
                    cursor_coordinates,
                    i * vector_size);
            }

            for (int distances_iterator = 0; distances_iterator < number_of_shift_positions; ++distances_iterator)
            {
                float dot_product = 0;
                for (int j = 0; j < vectors_per_point; ++j)
                {
                    var saved_coordinates = new System.Numerics.Vector <float>(
                        cached_data,
                        subtract_iterator);
                    var subtract_result = (saved_coordinates - cursor_position[j]);
                    subtract_result.CopyTo(cached_data, subtract_iterator + subtract_results_starting_index);

                    dot_product +=
                        System.Numerics.Vector.Dot(subtract_result, subtract_result);

                    subtract_iterator += vector_size;
                }
                distances[distances_iterator] = dot_product;
            }

            System.Numerics.Vector <float> distance_filter_vector = new System.Numerics.Vector <float>(distance_mask_treshold);
            long points_count_after_filtering = 0;

            for (i = 0; i < number_of_shift_positions; i += vector_size)
            {
                var dot_products_vec = new System.Numerics.Vector <float>(distances, i);
                var distance_vec     = System.Numerics.Vector.SquareRoot(dot_products_vec);
                distance_vec.CopyTo(distances, i);
                var filter_vec = System.Numerics.Vector.LessThan(distance_vec, distance_filter_vector);
                points_count_after_filtering += System.Numerics.Vector.Dot(filter_vec, filter_vec);
                filter_vec.CopyTo(distance_mask, i);
            }

            points_count_after_filtering -= i - number_of_shift_positions;

            if (points_count_after_filtering < number_of_considered_points)
            {
                cache.distance_mask_treshold *= 2;
                for (i = 0; i < number_of_shift_positions; i += vector_size)
                {
                    System.Numerics.Vector <int> .One.CopyTo(distance_mask, i);
                }
            }
            else if (points_count_after_filtering > number_of_considered_points * 4)
            {
                cache.distance_mask_treshold /= 1.1f;
            }
        }
示例#3
0
 public CalibrationManagerV1(Options.CalibrationMode mode, bool for_testing)
 {
     calibration_mode = mode;
     cache            = new ShiftStorageCache(mode);
     shift_storage    = new ShiftsStorage(calibration_mode, cache, for_testing);
 }