2017-02-17 5 views
2

내 질문에 매우 간단하고 잘만 대답 : 잘 때 나는 구성된 Eigen::MatrixXd 행렬을 가지고, 같은 행렬에 행을 채울 수있는 여러 스레드를 사용할 수 있습니까 시간 (만약 내가 어떤 행이 동시에 쓰여지는지 확신 할 수 없다면), 또는 각 쓰레드에 임시 행 객체를 생성 한 다음 줄 조작으로 행렬에 복사 (Uugh ...)해야합니까?행에 의해 Eigen :: MatrixXd에 대한 스레드 안전 쓰기

답변

3

Eigen::MatrixXd은 열 주요 저장소이므로 다른 스레드에서 같은 주소로 쓰지 않는 것이 안전 할 수 있지만 캐시에 혼란을 야기 할 수 있습니다 (기본적으로는 허위 공유입니다). 임시 행 행렬을 작성한 다음 열 행렬로 복사하는 것이 더 빠를 수도 있습니다.

또는 (더 나은 IMO) 기존 행렬의 열을 행으로 처리하고 (치수가 전환/일치하는지 확인한 다음) m.transposeInPlace()을 수행 할 수 있습니다. 행렬 모양과 정렬에 따라 m = m.transpose().eval()보다 더 효율적일 수 있습니다. 매트릭스가 충분히 크고 ID를 제로 경우도

스레드 'ID를 사용하는 것이 가능할 수있다 기반으로 예를 들어, OMP와 나 자신에 다른 ID의 추적을 유지하지 않고 std::thread 예를 들어, 유사하지 (연속). 행의 수가 캐시 라인 크기의 배수가되고 각 열이 정렬 된 메모리 블록에서 시작되도록 행렬을 패딩해야합니다. 캐시 라인이 64 바이트라고 가정합니다. 정수 배수의 블록을 처리하면 각 스레드가 "자체"캐시 라인에만 닿기 때문에 거짓 공유를 피할 수 있습니다. 이 작업을 수행 할 수있는 경우 추가 임시 임시 또는 사본/스왑이 없어야합니다.

+0

Eigen :: RowXpr을 Eigen :: MatrixXd에서 사용하는 것은 어떨까요? 캐시 페널티는 같은가요? Eigen :: RowXpr 주위를 돌아 다니며 작동하도록했습니다. 그러나 실제로는 임시를 생성하고 직접 사용하는 것보다 훨씬 빠르고 좋아 보이지 않았습니다. – ibell

+0

"문제"는 메모리의 기본 레이아웃이며 표현식 작성 방법이 아닌 동일한 캐시 라인의 인접한 주소에 쓰는 다른 스레드입니다. 보다 구체적인 질문/문제가있는 경우 [mcve]를 게시해야합니다. –