Re: patch 84

[email protected]
Newsgroups gmane.comp.gnu.gift.general
Message-ID <[email protected]>
On Tue, Oct 10, 2006 at 11:49:09AM -0500, [email protected] wrote:
> This patch is paticularly for david's eyes, as it gets rid of an ugliness in the code.
> 
> It takes memory clearing responsibilities out of gabor.c, and does them all at once in extract_block_features.c.
> 
> 3% speed improvement.
> 
> My next patch should be my last straight up speed optimization (good for another 8%!), but it renames a variable to a macro all *over* the place,
> so I havent submitted it yet.
> 
> Machine: opteron 246HE
> Mainline speed: 1.0
> CVS speed, with this patch: .44
> 
> Other people are welcome to criticize as well. ;)
> 
> Julia Longtin <[email protected]>
> 
you know, it really helps to attatch patches to these mails. :)

Julia Longtin <[email protected]>

_______________________________________________
help-GIFT mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-gift
84-ChangeLog (text/plain, 526 B)
--- ../../dev2/gift/ChangeLog	2006-10-08 18:51:32.000000000 -0500
+++ ChangeLog	2006-10-10 11:32:21.000000000 -0500
@@ -1,3 +1,13 @@
+2006-10-10    <[email protected]>
+
+	* FeatureExtraction/gabor.c
+	comment cleanups.
+	stop handling memory zeroing.
+	* FeatureExtraction/extract_block_features.c
+	comment cleanups.
+	handle zeroing memory for gabor_filter.
+	allocate conv, conv2, and filtered_image in one sweep. also memset them at the same time.
+
 2006-10-05    <[email protected]>
 
 	* FeatureExtraction/gabor.c
84-FeatureExtraction_gabor_c_reorg_memory_handling.patch (text/plain, 2.8 KB)
--- ../../dev2/gift/FeatureExtraction/gabor.c	2006-10-08 18:51:38.000000000 -0500
+++ FeatureExtraction/gabor.c	2006-10-10 11:27:00.000000000 -0500
@@ -9,9 +9,6 @@
 
 #include "gabor.h"
 
-/* for MAX_WIDTH and MAX_HEIGHT */
-#include "gift_features.h"
-
 /* for uint32_t */
 #include <stdint.h>
 
@@ -59,7 +56,7 @@
 	int32_t x, x_c; /* ints to force type promotion later */
 	double u0, u, v, sigma, theta;
 
-	/* now set the values of the kernels */
+	/* set the values of the kernels */
 	u0 = u00;
 	for (i = 0; i < num_gabor_scales; i++) {
 		sigma = sigma_m(u0);
@@ -83,19 +80,17 @@
 	}
 }
 
-void gabor_filter(double *image, int width, int height, int filter_scale, int orientation, double **kernelsxy, double *output) {
+/* conv, conv2, and output need to be cleared before feeding them to this function. */
+/* conv and conv2 are just temporary space, for juggling image data between filters */
+void gabor_filter(double *image, int width, int height, int filter_scale, int orientation, double **kernelsxy, double *conv, double *conv2, double *output) {
 
 	uint32_t x, y;
 	uint32_t k;
 	double * target_kernal;
-	double conv[MAX_WIDTH*MAX_HEIGHT]; /* take advantage of our fixed image size. */
 	double * target_conv;
 	double * target_image;
 	double temparray[kernal_size[2]];
 
-	memset(&conv, 0, MAX_WIDTH*MAX_HEIGHT*sizeof(double));
-	memset(output, 0, MAX_WIDTH*MAX_HEIGHT*sizeof(double));
-
 	/* first convolution */
 	target_kernal=kernelsxy[filter_scale*num_gabors_per_scale+orientation];
 	for (x = 0; x < width; x++) {
@@ -144,8 +139,6 @@
 	}
 	}
 
-	memset(&conv, 0, MAX_WIDTH*MAX_HEIGHT*sizeof(double));
-
 	/* third convolution */
 	target_kernal=&target_kernal[kernal_size[filter_scale]];
 	for (x = 0; x < width; x++) {
@@ -156,13 +149,13 @@
 		    for (k = 0; k < kernal_size[filter_scale]; k++)
 		      temparray[k]= target_kernal[k]*target_image[k];
 		    for (k = 0; k < kernal_size[filter_scale]; k++)
-		      conv[((width*height)-1)-(x*height+y)] += temparray[k];
+		      conv2[((width*height)-1)-(x*height+y)] += temparray[k];
 		  }
 		else
 		  {
 		for (k=0; k < kernal_size[filter_scale]; k++) {
 			if ((x+kernal_size[filter_scale]/2 >= k) && (x+kernal_size[filter_scale]/2 < width+k)) {
-				conv[((width*height)-1)-(x*height+y)] +=
+				conv2[((width*height)-1)-(x*height+y)] +=
 					target_kernal[k]*target_image[k];
 			}
 		}
@@ -174,7 +167,7 @@
 	target_kernal=&target_kernal[kernal_size[filter_scale]];
 	for (x = 0; x < width; x++) {
 	for (y = 0; y < height; y++) {
-		target_conv=&conv[((width*height)-1)-(x*height+y+(kernal_size[filter_scale]/2))];
+		target_conv=&conv2[((width*height)-1)-(x*height+y+(kernal_size[filter_scale]/2))];
 		if (((y>=kernal_size[filter_scale]/2)) && ((y+kernal_size[filter_scale]/2)<height))
 		  {
 		    /* first do the matrix multiply, then do the summation, so the matrix multiply can be vectored. */
84-FeatureExtraction_extract_block_features_c_reorg_memory_handling.patch (text/plain, 1.5 KB)
--- ../../dev2/gift/FeatureExtraction/extract_block_features.c	2006-09-15 15:12:44.000000000 -0500
+++ FeatureExtraction/extract_block_features.c	2006-10-10 11:26:32.000000000 -0500
@@ -130,6 +130,8 @@
 	int energy_class;
 	PPM *value_plane;
 	double *value_image_dbl, *filtered_image;
+	double *conv;
+	double *conv2;
 	double gabor_mean;
 	double * kernelsxy[num_gabor_scales*num_gabors_per_scale];
 
@@ -142,7 +144,10 @@
 		  "array" gabor_ranges[]
 	*/
 
-	filtered_image = (double *)malloc(im_hsv->width*im_hsv->height*sizeof(double));
+	/* this is all created with one malloc, so that it can be cleared in one memset() call */
+	filtered_image = (double *)malloc(im_hsv->width*im_hsv->height*sizeof(double)*3);
+	conv=&filtered_image[im_hsv->width*im_hsv->height];
+	conv2=&conv[im_hsv->width*im_hsv->height];
 
 	create_filter_kernels(kernelsxy);
 
@@ -150,8 +155,11 @@
 	for (scale = 0; scale < num_gabor_scales; scale++) {
 		for (orientation = 0; orientation < num_gabors_per_scale; orientation++) {
 
+			/* this clears conv, conv2, and filtered_image in one call. */
+			memset(filtered_image, 0, MAX_WIDTH*MAX_HEIGHT*sizeof(double)*3);
+
 			/* filter the image */
-			gabor_filter(im_hsv->value_plane_double_reversed, im_hsv->width, im_hsv->height, scale, orientation, kernelsxy, filtered_image);
+			gabor_filter(im_hsv->value_plane_double_reversed, im_hsv->width, im_hsv->height, scale, orientation, kernelsxy, conv, conv2, filtered_image);
 
 			/* extract the rms energy for each block */
 			k = 0; /* block counter */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.