(
finvoke: PackedFunc,
dev: DLDevice,
nstep: number,
repeat: number,
minRepeatMs: number,
limitZeroTimeIterations: number,
cooldownIntervalMs: number,
repeatsToCooldown: number
)
| 1948 | |
| 1949 | // Helper function to time the finvoke |
| 1950 | const timeExecution = async ( |
| 1951 | finvoke: PackedFunc, |
| 1952 | dev: DLDevice, |
| 1953 | nstep: number, |
| 1954 | repeat: number, |
| 1955 | minRepeatMs: number, |
| 1956 | limitZeroTimeIterations: number, |
| 1957 | cooldownIntervalMs: number, |
| 1958 | repeatsToCooldown: number |
| 1959 | ): Promise<Uint8Array> => { |
| 1960 | // detach and explicit dispose when tasks is fullfilled |
| 1961 | // the promise will immediately return and we need to makesure |
| 1962 | // finvoke do not get recycled. |
| 1963 | this.ctx.detachFromCurrentScope(finvoke); |
| 1964 | |
| 1965 | finvoke(this.scalar(1, "int32")); |
| 1966 | await dev.sync(); |
| 1967 | const result = []; |
| 1968 | let setupNumber: number = nstep; |
| 1969 | |
| 1970 | for (let i = 0; i < repeat; ++i) { |
| 1971 | let durationMs = 0.0; |
| 1972 | let absoluteZeroTimes = 0; |
| 1973 | do { |
| 1974 | if (durationMs > 0.0) { |
| 1975 | const golden_ratio = 1.618; |
| 1976 | setupNumber = Math.floor( |
| 1977 | Math.max(minRepeatMs / (durationMs / setupNumber) + 1, setupNumber * golden_ratio) |
| 1978 | ); |
| 1979 | } |
| 1980 | const tstart: number = perf.now(); |
| 1981 | finvoke(this.scalar(setupNumber, "int32")); |
| 1982 | await dev.sync(); |
| 1983 | const tend: number = perf.now(); |
| 1984 | |
| 1985 | durationMs = tend - tstart; |
| 1986 | if (durationMs === 0) { |
| 1987 | absoluteZeroTimes++; |
| 1988 | } |
| 1989 | } while (durationMs < minRepeatMs && absoluteZeroTimes < limitZeroTimeIterations); |
| 1990 | const speed = durationMs / setupNumber / 1000; |
| 1991 | result.push(speed); |
| 1992 | if (cooldownIntervalMs > 0.0 && (i % repeatsToCooldown) === 0) { |
| 1993 | await new Promise(r => setTimeout(r, cooldownIntervalMs)); |
| 1994 | } |
| 1995 | } |
| 1996 | const ret = new Float64Array(result.length); |
| 1997 | ret.set(result); |
| 1998 | |
| 1999 | // dispose finvoke |
| 2000 | finvoke.dispose(); |
| 2001 | return new Uint8Array(ret.buffer); |
| 2002 | }; |
| 2003 | |
| 2004 | const addOne = async (x: number): Promise<number> => { |
| 2005 | await new Promise(resolve => setTimeout(resolve, 100)); |
nothing calls this directly
no test coverage detected