• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import { TraficEnum } from '../utils/QueryEnum';
17import { filterDataByGroup } from '../utils/DataFilter';
18import { Args } from '../CommonArgs';
19
20export const chartXpowerGpuFreqCountDataSql = (args: Args): string => {
21  return `
22    select
23      start_time - ${args.recordStartNS} as startNs,
24      0 as dur,
25      COUNT(start_time) as value
26    from
27      xpower_app_detail_gpu
28    group by
29      startNs
30    order by
31      startNs
32      `;
33};
34
35export const chartXpowerGpuFreqDataSql = (args: Args): string => {
36  return `
37    select
38      start_time - ${args.recordStartNS} as startNs,
39      run_time as runTime,
40      idle_time as idleTime,
41      0 as dur,
42      frequency
43    from
44      xpower_app_detail_gpu
45      `;
46};
47
48export function xpowerDataGpuFreqCountReceiver(data: unknown, proc: Function): void {
49  // @ts-ignore
50  if (data.params.trafic === TraficEnum.Memory) {
51    let res: unknown[];
52    let list: unknown[];
53    // @ts-ignore
54    list = proc(chartXpowerGpuFreqCountDataSql(data.params));
55    for (let j = 0; j < list.length; j++) {
56      if (j === list.length - 1) {
57        // @ts-ignore
58        list[j].dur = (data.params.totalNS || 0) - (list[j].startNs || 0);
59      } else {
60        // @ts-ignore
61        list[j].dur = (list[j + 1].startNs || 0) - (list[j].startNs || 0);
62      }
63    }
64    // @ts-ignore
65    if (data.params.queryAll) {
66      //框选时候取数据,只需要根据时间过滤数据
67      res = (list || []).filter(
68        // @ts-ignore
69        (it) => it.startNs + it.dur >= data.params.selectStartNS && it.startNs <= data.params.selectEndNS
70      );
71    } else {
72      res = filterDataByGroup(
73        list || [],
74        'startNs',
75        'dur',
76        // @ts-ignore
77        data.params.startNS,
78        // @ts-ignore
79        data.params.endNS,
80        // @ts-ignore
81        data.params.width,
82        'value'
83      );
84    }
85    gpuFreqCountArrayBufferHandler(data, res, true);
86  } else {
87    // @ts-ignore
88    let sql = chartXpowerGpuFreqCountDataSql(data.params);
89    let res = proc(sql);
90    // @ts-ignore
91    gpuFreqCountArrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
92  }
93}
94
95function gpuFreqCountArrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
96  // @ts-ignore
97  let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS);
98  // @ts-ignore
99  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
100  // @ts-ignore
101  let value = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.value);
102  res.forEach((it, i) => {
103    // @ts-ignore
104    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.xpowerGpuFreqCountData);
105    // @ts-ignore
106    dur[i] = it.dur;
107    // @ts-ignore
108    startNS[i] = it.startNs;
109    // @ts-ignore
110    value[i] = it.value;
111  });
112  (self as unknown as Worker).postMessage(
113    {
114      // @ts-ignore
115      id: data.id,
116      // @ts-ignore
117      action: data.action,
118      results: transfer
119        ? {
120            startNS: startNS.buffer,
121            dur: dur.buffer,
122            value: value.buffer,
123          }
124        : {},
125      len: res.length,
126      transfer: transfer,
127    },
128    transfer ? [dur.buffer, startNS.buffer, value.buffer] : []
129  );
130}
131
132export function xpowerDataGpuFreqReceiver(data: unknown, proc: Function): void {
133  // @ts-ignore
134  if (data.params.trafic === TraficEnum.Memory) {
135    let res: unknown[];
136    let list: unknown[];
137    // @ts-ignore
138    list = proc(chartXpowerGpuFreqDataSql(data.params));
139    for (let j = 0; j < list.length; j++) {
140      // @ts-ignore
141      list[j].dur = 3000000000;
142    }
143    // @ts-ignore
144    if (data.params.queryAll) {
145      //框选时候取数据,只需要根据时间过滤数据
146      res = (list || []).filter(
147        // @ts-ignore
148        (it) => it.startNs + it.dur >= data.params.selectStartNS && it.startNs <= data.params.selectEndNS
149      );
150    } else {
151      res = list;
152    }
153    gpuFreqArrayBufferHandler(data, res, true);
154  } else {
155    // @ts-ignore
156    let sql = chartXpowerGpuFreqDataSql(data.params);
157    let res = proc(sql);
158    // @ts-ignore
159    gpuFreqArrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
160  }
161}
162
163function gpuFreqArrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
164  // @ts-ignore
165  let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS);
166  // @ts-ignore
167  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
168  // @ts-ignore
169  let runTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.runTime);
170  // @ts-ignore
171  let idleTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.idleTime);
172  // @ts-ignore
173  let frequency = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.frequency);
174
175  res.forEach((it, i) => {
176    // @ts-ignore
177    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.xpowerGpuFreqData);
178    // @ts-ignore
179    dur[i] = it.dur;
180    // @ts-ignore
181    startNS[i] = it.startNs;
182    // @ts-ignore
183    runTime[i] = it.runTime;
184    // @ts-ignore
185    idleTime[i] = it.idleTime;
186    // @ts-ignore
187    frequency[i] = it.frequency;
188  });
189  (self as unknown as Worker).postMessage(
190    {
191      // @ts-ignore
192      id: data.id,
193      // @ts-ignore
194      action: data.action,
195      results: transfer
196        ? {
197            startNS: startNS.buffer,
198            dur: dur.buffer,
199            runTime: runTime.buffer,
200            idleTime: idleTime.buffer,
201            frequency: frequency.buffer,
202          }
203        : {},
204      len: res.length,
205      transfer: transfer,
206    },
207    transfer ? [dur.buffer, startNS.buffer, runTime.buffer, idleTime.buffer, frequency.buffer] : []
208  );
209}
210