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