7 포인트 계산 스텐실 캐시 C에서 액세스 (또는 1D 배열에 3D 배열을 맵핑)

StackOverflow https://stackoverflow.com/questions/1883319

  •  19-09-2019
  •  | 
  •  

문제

7 점 전산 스텐실과 관련된 문제가 있습니다. 모르는 사람들에게는 이것이 3D 그리드 일 것이고, 7 점은 X, Y 및 Z 방향에서 한 지점 (또는 동쪽으로 이웃)이라는 점에서 한 지점입니다. /West/North/South 및 Up/Down).

따라서이 6 점 + 내가 작업중인 1 개의 추가 지점은 계산에 사용되며 모두 1 차원 배열에 저장됩니다.

NX가 큐브의 너비이고 NY는 높이라고 가정합니다. 메모리에서 All_points [n]과 같은 배열 All_points의 점에 액세스 할 때 각 방향으로 이웃을 얻으려면 All_points [n-1], all_points [n+1]에 액세스하고 싶습니다. , all_points [n-nx], all_points [n+nx], all_points [n-nxNY] 및 ALL_POINTS [N+NXNY].

그래서 이것에 대한 나의 문제는 내가 많은 캐시가 놓치고 있다는 것입니다. 이 문제를 피하는 방법을 보여주는 코드 예제를 찾을 수없는 것 같습니다. 이상적으로는이 배열을 All_x_points []와 같은 X, y 및 Z 좌표로 다시 나누고 싶습니다. 그러나 All_Points [n]이 변경되기 때문에 해당 업데이트를 유지하려는 문제가 발생합니다. 즉, 다른 all_points [n '] 내 x, y 또는 z 값이 업데이트되어야합니다.

이런 종류의 일을 본 사람이 있습니까?

도움이 되었습니까?

해결책

7 포인트 스텐실을 사용하는 액세스 패턴은 무엇입니까? 캐시 일관성 문제가있는 경우 중앙 (x, y, z) 좌표의 액세스 패턴이 완전히 무작위이든 경우에 묻는 첫 번째 질문입니다. 운이 좋지 않을 수 있습니다.

액세스 패턴을 제어 할 수있는 경우 캐시 친화적으로 조정할 수 있습니다. 그렇지 않다면 어떤 종류의 액세스 패턴을 기대 해야하는지 고려해야합니다. 이 액세스 패턴이 더 양성되도록 데이터를 정리할 수 있습니다. 이 두 가지의 조합은 때때로 매우 효과적 일 수 있습니다.

비트 인터 리베이션 어레이 레이아웃과 같은 이러한 종류에 자주 유용한 특정 데이터 배열이 있습니다. 각 좌표의 크기는 2의 힘이라고 (단순성) 가정하십시오. 그런 다음 "정상적인"레이아웃은 각 좌표에 대한 비트를 연결하여 인덱스를 구축합니다. 그러나 비트 간리 레이아웃은 라운드 로빈 방식으로 각 차원에 비트를 할당합니다.

3D index coords: (xxxx, yyyy, zzzz)

normal index:    data[zzzzyyyyxxxx]  (x-coord has least-significant bits, then y)
bit-interleaved: data[zyxzyxzyxzyx]  (lsb are now relatively local)

실제로 말하면, 작은 비용이 있습니다. 코디네이트에 스텝 값을 곱하는 대신도 조회 테이블을 사용하여 오프셋을 찾아야합니다. 그러나 아마도 매우 짧은 조회 테이블 (특히 3D 배열의 경우) 만 필요할 것입니다. 모두 캐시에 잘 맞아야합니다.

3D coords:  (x,y,z)

normal index:      data[x + y*ystep + z*zstep]  where:
  ystep= xsize (possibly aligned-up, if not a power of 2?)
  zsetp= ysize * ystep

bit-interleaved:   data[xtab[x] + ytab[y] + ztab[z]]  where:
  xtab={  0,  1,  8,  9, 64, 65, 72, 73,512...}   (x has bits 0,3,6,9...)
  ytab={  0,  2, 16, 18,128,130,144,146,1024...}  (y has bits 1,4,7,10...)
  ztab={  0,  4, 32, 36,256,260,288,292,2048...}  (y has bits 2,5,8,11...)

궁극적으로 이것이 어떤 사용인지 여부는 전적으로 알고리즘의 요구 사항에 달려 있습니다. 그러나 알고리즘이 캐시를 너무 요구하는 경우 레이아웃 대신 알고리즘을 조정할 수 있습니다.

다른 팁

7 점? 6 공간 좌표 정의, 하나는 길이를 정의합니까? 이것들은 ... 스타 게이트 좌표입니까?

구조 (AOS) 배열 (SOA) 구조 (SOA)로 바꾸지 않겠습니까?

int point = points_all[i]; // the point you want
Vec2 points_x[point]; // x and y are the neighbours left and right
Vec2 points_y[point]; // x and y are the neighbours up and down
Vec2 points_z[point]; // x and y are the neighbours front and back
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top