File: MakeTextureTimingTest.m

package info (click to toggle)
psychtoolbox-3 3.0.14.20170103%2Bgit6-g605ff5c.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 103,044 kB
  • ctags: 69,483
  • sloc: ansic: 167,371; cpp: 11,232; objc: 4,708; sh: 1,875; python: 383; php: 344; makefile: 207; java: 113
file content (110 lines) | stat: -rw-r--r-- 4,072 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
% MakeTextureTimingTest
%
% Screen 'MakeTexture' both allocates memory to hold an OpenGL texture and
% loads a MATLAB matrix into the OpenGL texture. TestMakeTextureTiming
% times those two steps separately, reporting the fraction of time which
% MakeTexture spends allocating memory.   
%
% On 1GHz G4, MakeTexture spends less than 3% of its time allocating memory.
% Providing separate Screen subfuntions to allocate and fill textures would
% gain little.
%
% see also: PsychTests

% HISTORY
%
% mm/dd/yy
%
% 1/26/05   awi     wrote it.


try
    %test for a variety of texture sizes up to the screen size. 
    screenNumber=max(Screen('Screens'));
    w=Screen('OpenWindow', screenNumber, [], [], [], 2);
    screenRect=Screen('Rect', screenNumber);
    screenDimensions=[RectWidth(screenRect), RectHeight(screenRect)];
    maxTextureSize=min(screenDimensions);
    numTextures=floor(log2(maxTextureSize));
    textureSizes=2.^([1:numTextures])+1;
    numSamples=10;
    %turn on the debugging switch for 'MakeTexture' to record internal
    %timing.  See the C source to MakeTexture to see at where times are recorded. 

    %The preference call tells MakeTexture to record timestamps marking internal events into the time list. 
    Screen('Preference','DebugMakeTexture', 1);
    for i=1:numTextures
        fprintf(['Step ' int2str(i) ' of ' int2str(numTextures) ': ']);
        fprintf(['Timing generation of a ' int2str(textureSizes(i)) 'x' int2str(textureSizes(i)) ' texture:\n']);
        fprintf(['Repeating measurement ' int2str(numSamples) ' times; counting ']);
        for s=1:numSamples
            fprintf(int2str(s));
            if s<numSamples
                fprintf('.. ');
            else
                fprintf('.');
            end
            Screen('ClearTimeList');
            t=Screen('MakeTexture',w,magic(textureSizes(i)));
            rawTimes=Screen('GetTimeList');  %index by texture, sample, timestamp
            zeroRefTimes=rawTimes-rawTimes(1);
            timeList(i,s,:)=zeroRefTimes;
            %no reason to accumulate textures except to investigate memory loading vs allocation time.
            Screen('Close', t);
        end
        fprintf('\n\n');
    end
    Screen('Preference','DebugMakeTexture', 0);
catch 
    Screen('Preference','DebugMakeTexture', 0);
    Screen('CloseAll');
    psychrethrow(psychlasterror);
end

%Verify that turning off DebugMakeTexture causes values not to accumulate in
%the timing list.
Screen('ClearTimeList');
tFoo=Screen('MakeTexture',w,magic(textureSizes(1)));
if Screen('GetTimeList') > 0
    error('Turning off DebugMakeTexture failed to disable debugging in MakeTexture');
end %if


Screen('CloseAll')


%Average measurements and plot results

%When DebugMakeTexture is enabled, each call to MakeTexture generates four
% timestamps at these events:
% timestamp 1: Upon entering the SCREENMakeTexture C function
% timestamp 2: Immediatly before the valloc call to allocate texture memory
% timestamp 3: Immediatly before the valloc call to allocate texture memory
% timestamp 4: Immediatly before exit from SCREENMakeTexture.

%the indices into our result array are:
%timeList( texture size index,  repetition index, timestamp index)

[foo, bar, numTimestamps]=size(timeList);
if numTimestamps ~= 4
    error('MakeTexture stores more than the expected four timestamps.');
end


%first average across repeated measurements
for tex=1:numTextures
    for ts=1:numTimestamps
        avgTimes(tex, ts)=mean(timeList(tex, :, ts));
    end %for ts
end %for tx

allocationTimes=avgTimes(:,3) - avgTimes(:,2);
meanAllocationTimes=mean(allocationTimes);
copyTimes=avgTimes(:,4) - avgTimes(:,3);
meanCopyTimes=mean(copyTimes);

fprintf('Result:\n');
fprintf(['Average time to allocate texture memory: ' num2str(meanAllocationTimes) ' Secs.\n']);
fprintf(['Average time to copy the MATLAB matrix into the OpenGL texture: ' num2str(meanCopyTimes) ' Secs\n']);
fprintf(['Average proportion of time which MakeTexture spends allocating memory: ' num2str(meanAllocationTimes/meanCopyTimes) '\n']);