Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. IF SSE or AVX or AVX2 or AVX512:
  2. cdef void create_sub_grid(GridSt* grid,
  3. lock_type* lock,
  4. int* xyz,
  5. float* m_bbox,
  6. int cell) nogil:
  7.  
  8. cdef:
  9. int indices, i1, i2, polygon, off, sub_cell, x, y, z
  10. int* xyz_ptr = NULL
  11. int* memory_ptr = NULL
  12. __m128 bbmin = load3f(grid.sub_bbmin[cell])
  13. __m128 cell_inv = load3f(grid.sub_cell_dim_inv[cell])
  14. __m128i zeros = zero4i()
  15. __m128i ones = one4i()
  16. __m128i res = sub4i(load3i(grid.sub_res[cell]), ones)
  17.  
  18. grid.sub_grid[cell] = &grid.sub_cells_mem[grid.sub_cell_offset[cell]]
  19. grid.sub_indices[cell] = &grid.sub_indices_mem[grid.sub_cell_offset[cell]]
  20.  
  21. i1 = 0
  22. indices = 0
  23. for i2 in range(grid.top_indices[cell]):
  24. xyz_ptr = &xyz[i1]
  25. polygon_to_sub_cells(grid, &m_bbox[grid.top_grid[grid.top_cell_offset[cell] + i2] * 6], xyz_ptr, bbmin, cell_inv, zeros, ones, res)
  26. for z in range(xyz_ptr[2], xyz_ptr[6]):
  27. for y in range(xyz_ptr[1], xyz_ptr[5]):
  28. for x in range(xyz_ptr[0], xyz_ptr[4]):
  29. grid.sub_indices[cell][grid_cell(x, y, z, grid.sub_res[cell])] += 1
  30. indices += 1
  31. #incr(&grid.sub_indices[cell][grid_cell(x, y, z, grid.sub_res[cell])])
  32. #incr(&indices)
  33. i1 += 8
  34.  
  35. set_lock(lock)
  36. if not memory.error:
  37. if grid.array_index[grid.bucket_index] + indices >= grid.max_array_size[grid.bucket_index]:
  38. incr(&grid.bucket_index)
  39. if grid.bucket_index > 2:
  40. if grid.bucket_index > MAX_ARRAY_INDEX:
  41. memory.error = True
  42. unlock(lock)
  43. return
  44. else:
  45. if indices > grid.max_array_size[grid.bucket_index]:
  46. grid.max_array_size[grid.bucket_index] = indices
  47.  
  48. MEM_palloc(&grid.memory[grid.bucket_index], grid.max_array_size[grid.bucket_index])
  49. if memory.error:
  50. unlock(lock)
  51. return
  52.  
  53. memory_ptr = &grid.memory[grid.bucket_index][grid.array_index[grid.bucket_index]]
  54. grid.array_index[grid.bucket_index] += indices
  55. else:
  56. memory_ptr = &grid.memory[grid.bucket_index][grid.array_index[grid.bucket_index]]
  57. grid.array_index[grid.bucket_index] += indices
  58. unlock(lock)
  59.  
  60. if not memory.error:
  61. off = 0
  62. for i2 in range(grid.max_sub_cells[cell]):
  63. if grid.sub_indices[cell][i2] > 0:
  64. grid.sub_grid[cell][i2] = &memory_ptr[fetch_and_add(&off, grid.sub_indices[cell][i2])]
  65. grid.sub_indices[cell][i2] = 0
  66.  
  67. i1 = 0
  68. for i2 in range(grid.top_indices[cell]):
  69. xyz_ptr = &xyz[i1]
  70. polygon = grid.top_grid[grid.top_cell_offset[cell] + i2]
  71. for z in range(xyz_ptr[2], xyz_ptr[6]):
  72. for y in range(xyz_ptr[1], xyz_ptr[5]):
  73. for x in range(xyz_ptr[0], xyz_ptr[4]):
  74. sub_cell = grid_cell(x, y, z, grid.sub_res[cell])
  75. grid.sub_grid[cell][sub_cell][grid.sub_indices[cell][sub_cell]] = polygon
  76. grid.sub_indices[cell][sub_cell] += 1
  77. i1 += 8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement