| 5264 | } |
| 5265 | |
| 5266 | void ecall_reducemax_zero_grad(float *input,float *grad,int N,int M,int C,int L,float *output){ |
| 5267 | float *x = (float*)malloc(sizeof(float)*N); |
| 5268 | memset(x, 0, sizeof(float)*N); |
| 5269 | for(int j=0;j<N;j++){ |
| 5270 | x[j] = 0.0f; |
| 5271 | float sum = input[insert*N+j]; |
| 5272 | float c = 0.0f; |
| 5273 | for(int i=0;i<Nt;i++){ |
| 5274 | float y = input[indexs[i]*N+j] - c; |
| 5275 | float t = sum + y; |
| 5276 | c = (t - sum) - y; |
| 5277 | sum = t; |
| 5278 | } |
| 5279 | x[j] = sum; |
| 5280 | |
| 5281 | } |
| 5282 | float *x1 = (float*)malloc(sizeof(float)*C*L); |
| 5283 | memset(x1, 0, sizeof(float)*C*L); |
| 5284 | |
| 5285 | for (int i = 0; i < C; i++) { |
| 5286 | for (int j = 0; j < L; j++) { |
| 5287 | float max_val = x[i*L+j]; |
| 5288 | for (int k = 1; k < M; k++) { |
| 5289 | max_val = fmaxf(max_val, x[i*L+j+k*C*L]); |
| 5290 | } |
| 5291 | x1[i*L+j] = max_val; |
| 5292 | } |
| 5293 | } |
| 5294 | |
| 5295 | for (int i = 0; i < C; i++) { |
| 5296 | for (int j = 0; j < L; j++) { |
| 5297 | for (int k = 0; k < M; k++) { |
| 5298 | if(fabs(x[i*L+j+k*C*L]-x1[i*L+j]) < 1e-7f){ |
| 5299 | x[i*L+j+k*C*L] = grad[i*L+j]; |
| 5300 | for(int kk = k+1; kk < M; kk++){ |
| 5301 | x[i*L+j+kk*C*L] = 0.0f; |
| 5302 | } |
| 5303 | break; |
| 5304 | } |
| 5305 | else{ |
| 5306 | x[i*L+j+k*C*L] = 0.0f; |
| 5307 | } |
| 5308 | } |
| 5309 | } |
| 5310 | } |
| 5311 | float mean = 0.0f, std, mean_sqr = 0.0f; |
| 5312 | float c_mean = 0.0f, c_mean_sqr = 0.0f; |
| 5313 | |
| 5314 | for (int j = 0; j < N; j++) { |
| 5315 | float y = (x[j]/static_cast<float>(N)) - c_mean; |
| 5316 | float t = mean + y; |
| 5317 | c_mean = (t - mean) - y; |
| 5318 | mean = t; |
| 5319 | |
| 5320 | float y2 = (x[j]*x[j]/static_cast<float>(N)) - c_mean_sqr; |
| 5321 | float t2 = mean_sqr + y2; |
| 5322 | c_mean_sqr = (t2 - mean_sqr) - y2; |
| 5323 | mean_sqr = t2; |
no test coverage detected