2013-04-10 5 views
0

병렬 컴퓨팅에 대해 많이 알지는 못하지만 과제의 "추가 작업"에 대한 제안을하고 싶습니다. C++에서 레이 트레이서를 작성했습니다. 나는 vector에 hitpoints와 같은 광선 정보를 저장하고 시뮬레이션의 끝 부분에서 CSV에이 벡터를 씁니다. (좋은 프로그래밍입니까?) 많은 수의 광선을 추적하면 시뮬레이션은 추적에 비해 더 많은 시간이 걸립니다 100 번 광선 10 번. 내 vector's의 크기가 더 크기 때문에 힙 메모리 (?)에서 많은 공간을 차지하기 때문에 이것이라고 가정합니다. 각 광선은 다른 광선으로부터의 정보없이 추적 될 수 있습니다 (프로그램이 병렬로 만들어 지도록 요청 됨). 올바른 프로그램이라면 각 프로세서마다 고유의 메모리가 있으므로 커다란 벡터가 하나의 거대한 메모리 블록을 차지하는 대신 작은 벡터가 퍼져 더 효율적으로 처리 될 수 있다는 것입니다.메모리 사용 병렬 프로그래밍

+0

또는 프로그램을 스레드 화 ('std :: thread')하여 병렬 실행을 허용하십시오. – Mushy

+1

1x1000 대 10x100 테스트에서 서로 다른 광선을 사용하는 것 같습니다. 그렇다면 동일한 광선이 측정 된 시간을 측정하고 있음을 조사 할 것입니다. 나는 그다지 작지 않은 몸체를 기꺼이 내기를 원할 것입니다 .- 벡터의 크기는 전적으로 무의미합니다. 주 메모리 속도는 GB/s 단위로 측정됩니다. 추가 요소가 '몇'(천 또는 백만 개)이면 실행 속도에 눈에 띄는 영향을 미치지 않습니다. 왜 벡터의 속도를 보거나 (다른 사람의 결과를 찾는다) QueryHighPerformanceFrequency와 QueryHighPerformanceTimer - 둘 다 창문에서 작업 할 때 편리합니다. – enhzflep

+0

Ok - 기본적으로 내 질문에 대한 답변입니다. 2 천만 개 요소의 벡터는 작은 벡터에 비해 시뮬레이션에 실질적으로 영향을 미치지 않습니다. 감사합니다 – Seb

답변

1

CPU 캐시 사용을 향상시키기위한 시도처럼 자신의 '메모리'가있는 각 프로세서에 대한 가정 (클러스터에 배포하지 않는 한 RAM은 작업의 병렬성에 관계없이 동일하게 유지됩니다). 일반적으로 병렬 처리가 CPU 캐시를 더 많이 제공하지만 스레드가 코어간에 마이그레이션 할 때 캐시 미스가 더 커질 수 있습니다 (실제로 Windows가이를 수행함).

아마도 std :: vector를 비효율적으로 사용하고있을 것입니다. 예 : 처음에 항목을 삽입하거나 하나씩 항목을 추가하고 있습니다 (이러한 조작에는 O (vector.size())까지 걸릴 수 있습니다). 또는 광선 수가 증가하면 속도가 느려지는 다른 데이터 구조가있을 수 있습니다. 그리고 이것은 여러 프로세서 사이에서 작업을 분할하지 않고도 고정 될 수 있습니다.

물론 병렬화로 인해 프로그램이 향상되지만.

+0

정확히 내가하고있는 것입니다. 결과를 '처리'할 필요가 전혀 없었으므로 장면을 통해 광선을 효율적으로 추적하는 데 많은 노력을 기울였습니다. 그러나 제가하고있는 일이 실제로 정확한지를 보여주기 위해, 레이가 오브젝트를 때릴 때마다 그 히트 포인트의 좌표와 함께 '벡터'를 추가하고 계산을 계속합니다. 결국, 나는 그 벡터를 csv에 쓴 다음 Matlab을 사용하여 예쁜 그림을 그려 낸다. 빠른 수정 방법이 있는가? – Seb

+0

벡터의 마지막 요소 수는 얼마입니까? 'your_vector.reserve (1000000);'(최대 1000000 개의 아이템을 저장할 것임을 전제로) 더 많은 지능적인 방법이 될 수있는 것은 새로운 요소를 추가 할 때 메모리 재 할당을 피하기 위해 벡터의 용량을이 수로 (또는 조금 더 크게) 설정할 수 있습니다. 이 출력 데이터를 합리적인 크기의 버퍼로 가지고 RAM에 모든 것을 저장하고 마지막에 큰 글을 쓰기보다는 CSV 파일로 플러시하십시오. – Inspired

+0

나는 벡터 크기 조정을 고려했지만 불행히도 광선이 모든 장면에서 튀어 오를 수 있었고 그래서 많은 hitpoint가 객체의 수보다 훨씬 더 많을 것이다. 버퍼의 경우, 나는 당신을 이해하고있다. 나는'vector.reserve (100000k) '을 가지고 있으며, 용량에 도달하면 CSV에 주기적으로 써 넣는다. – Seb