Home » Developing U++ » U++ Developers corner » SSE2 and SVO optimization (Painter, memcpy....)  
	
		
		
			| Re: BufferPainter::Clear() optimization [message #53967 is a reply to message #53966] | 
			Mon, 18 May 2020 17:08    | 
		 
		
			
				
				
				
					
						
						Tom1
						 Messages: 1305 Registered: March 2007 
						
					 | 
					Ultimate Contributor  | 
					 | 
		 
		 
	 | 
 
	
		Mirek, 
 
Here it is: The unconditional alignment. I took your idea, ditched my own, and modified your Fill3a as follows: 
 
void inline Fill3T(void *b, dword data, int len){
	switch(len){
		case 3: ((dword *)b)[2] = data;
		case 2: ((dword *)b)[1] = data;
		case 1: ((dword *)b)[0] = data;
		case 0: return;
	}
	__m128i q = _mm_set1_epi32(*(int*)&data);
	__m128i *w = (__m128i*)b;
	
	if(len >= 32) {
		__m128i *e = (__m128i*)b + (len>>2) - 8;
		if(len > 1024*1024 / 16 && ((uintptr_t)w & 3) == 0) { // for really huge data, bypass the cache
			_mm_storeu_si128(w, q); // Head align
			int s=(-((int)((uintptr_t)b)>>2))&0x3;
			w = (__m128i*) ((dword*)b) + s;
			do {
				_mm_stream_si128(w++, q);
				_mm_stream_si128(w++, q);
				_mm_stream_si128(w++, q);
				_mm_stream_si128(w++, q);
				_mm_stream_si128(w++, q);
				_mm_stream_si128(w++, q);
				_mm_stream_si128(w++, q);
				_mm_stream_si128(w++, q);
			}while(w<=e);
			_mm_sfence();
		}
		else
			do {
				_mm_storeu_si128(w++, q);
				_mm_storeu_si128(w++, q);
				_mm_storeu_si128(w++, q);
				_mm_storeu_si128(w++, q);
				_mm_storeu_si128(w++, q);
				_mm_storeu_si128(w++, q);
				_mm_storeu_si128(w++, q);
				_mm_storeu_si128(w++, q);
			}while(w<=e);
	}
	
	if(len & 16) {
		_mm_storeu_si128(w++, q);
		_mm_storeu_si128(w++, q);
		_mm_storeu_si128(w++, q);
		_mm_storeu_si128(w++, q);
	}
	if(len & 8) {
		_mm_storeu_si128(w++, q);
		_mm_storeu_si128(w++, q);
	}
	if(len & 4) {
		_mm_storeu_si128(w, q);
	}
	_mm_storeu_si128((__m128i*) (((dword*)b) + len - 4), q); // Tail align
}
 
 
I made some other changes too and this one is slightly faster on short transfers while equals Fill3a() on longer ones. The improvement is more significant on MSBT19 / MSBT19x64. 
 
In order to get real fast short transfers, the function must be 'inline'. I think this necessitates two variants of the final function. (I have seen that BufferPainter paints most of the time with really short fills, so inlining really makes a difference there.) 
 
Best regards, 
 
Tom 
 
P.S. My cache threshold is still at 8M...
		
		
		[Updated on: Mon, 18 May 2020 17:11] Report message to a moderator  
 |  
	| 
		
	 | 
 
 
 |  
  
 
	
	  | 
	 | 
	
		SSE2 and SVO optimization (Painter, memcpy....)
		By:  Tom1 on Mon, 27 April 2020 19:19  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 28 April 2020 10:12  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 28 April 2020 10:20  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 28 April 2020 10:27  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 28 April 2020 10:33  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 28 April 2020 11:10  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Oblivion on Tue, 28 April 2020 11:27  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 28 April 2020 11:17  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 15 May 2020 09:04  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 15 May 2020 10:18  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 15 May 2020 11:33  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 15 May 2020 11:41  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 15 May 2020 11:47  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 15 May 2020 12:08  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 15 May 2020 13:15  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 15 May 2020 13:36  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 15 May 2020 23:13  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Didier on Fri, 15 May 2020 23:45  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Sat, 16 May 2020 01:59  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Sun, 17 May 2020 08:47  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Sun, 17 May 2020 10:01  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Sun, 17 May 2020 15:49  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Sun, 17 May 2020 18:05  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Sun, 17 May 2020 20:56  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Sun, 17 May 2020 21:46  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Sun, 17 May 2020 23:25  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 18 May 2020 10:16  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Mon, 18 May 2020 11:13  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Mon, 18 May 2020 13:31  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 18 May 2020 13:53  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Mon, 18 May 2020 16:06  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Mon, 18 May 2020 17:08  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 18 May 2020 18:12  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 18 May 2020 18:28  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Mon, 18 May 2020 20:57  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Mon, 18 May 2020 21:20  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Mon, 18 May 2020 21:40  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 18 May 2020 21:56  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 18 May 2020 13:33  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Sun, 17 May 2020 00:10  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 15 May 2020 12:28  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 18 May 2020 13:43  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 19 May 2020 00:02  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 19 May 2020 08:59  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 19 May 2020 09:14  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 19 May 2020 09:49  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 19 May 2020 12:35  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 19 May 2020 12:45  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 19 May 2020 13:18  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 19 May 2020 16:22  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 01:34  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 01:52  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 08:22  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 10:04  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 10:20  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 10:55  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 11:56  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 12:23  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 12:41  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 12:53  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 13:01  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 15:18  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Thu, 21 May 2020 16:21  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 15:58  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 16:15  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 17:16  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 17:31  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Wed, 20 May 2020 17:37  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 19:51  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Thu, 21 May 2020 09:04  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Thu, 21 May 2020 13:28  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Thu, 21 May 2020 16:38  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  koldo on Thu, 21 May 2020 17:51  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Thu, 21 May 2020 19:22  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Thu, 21 May 2020 19:25  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Didier on Fri, 22 May 2020 09:32  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 22 May 2020 10:04  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 22 May 2020 10:05  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 22 May 2020 10:28  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 22 May 2020 11:13  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 22 May 2020 11:39  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 22 May 2020 11:46  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 22 May 2020 11:59  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  koldo on Fri, 22 May 2020 12:47  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 22 May 2020 13:01  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 22 May 2020 13:06  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  koldo on Fri, 22 May 2020 16:58  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 22 May 2020 19:03  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Sun, 24 May 2020 10:20  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 26 May 2020 13:14  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 26 May 2020 14:15  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 01 June 2020 00:39  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  omari on Mon, 01 June 2020 11:24  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Mon, 01 June 2020 15:47  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 02 June 2020 13:59  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 02 June 2020 17:43  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Tue, 02 June 2020 18:31  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Thu, 04 June 2020 17:23  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Thu, 04 June 2020 17:45  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Novo on Thu, 04 June 2020 18:07  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Thu, 04 June 2020 20:20  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 12 June 2020 12:23  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 12 June 2020 12:55  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 12 June 2020 16:28  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Novo on Fri, 12 June 2020 18:45  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Sat, 13 June 2020 10:15  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  coolman on Sat, 13 June 2020 10:33  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Novo on Sat, 13 June 2020 13:07  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  coolman on Sat, 13 June 2020 14:45  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Didier on Sun, 14 June 2020 12:45  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Sun, 14 June 2020 14:09  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Thu, 04 June 2020 18:48  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  koldo on Fri, 22 May 2020 10:29  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Fri, 22 May 2020 11:32  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Fri, 22 May 2020 11:32  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  Tom1 on Wed, 20 May 2020 12:52  
	 | 
 
	  | 
	 | 
	
		Re: BufferPainter::Clear() optimization
		By:  mirek on Tue, 19 May 2020 11:32  
	 | 
  
Goto Forum:
 
 Current Time: Tue Nov 04 15:40:41 CET 2025 
 Total time taken to generate the page: 0.06039 seconds 
 |