public ShiftsStorage(Options.CalibrationMode mode, bool for_testing) { calibration_mode = mode; DefaultPath = GetFilepath(Helpers.UserDataFolder); this.cache = new ShiftStorageCache(mode); if (!for_testing) { LoadFromFile(); } }
// 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; } }
public CalibrationManagerV1(Options.CalibrationMode mode, bool for_testing) { calibration_mode = mode; cache = new ShiftStorageCache(mode); shift_storage = new ShiftsStorage(calibration_mode, cache, for_testing); }