다음과 같이 스레드 로컬이 아닌 배열이 있습니다.비 스레드 로컬 데이터를 가리키는 스레드 로컬 포인터
long array[NTHREADS];
여기서 array [0]은 스레드 0으로, array [1]은 스레드 1로 관리하는 식으로 배열됩니다. 어떤 지점에서는 쓰레드가 다른 쓰레드의 부분을 읽어야하기 때문에 쓰레드 로컬 변수를 사용하지 않았습니다. 그러나 대부분의 경우 자신의 부분을 수정합니다. 물론 우리는 array[thread_id]
을 사용하여 데이터를 수정할 수 있지만 실행 속도를 높이기 위해 포인터를 사용하고 싶습니다.
이제 각 스레드가 자체 데이터를 관리하므로 포인터는 로컬 스레드이며 처음에 할당되어야합니다. 그래서 나는 이와 같은 것을 필요로한다 (gcc 구문으로). 이런 식으로
__thread long* tl_ptr;
tl_ptr = &array[threadid];
, 나는
*tl_ptr
를 사용하여 스레드가 특정 데이터를 수정할 수 있습니다. 이제이 질문이 올바른 방법일까요? 이 접근법에 문제가 있습니까?
_we, 난 pointer._ ← 조기 최적화 저쩌구 ... _Here 어레이 [0] 스레드 0에 의해 관리되는, 배열 [1 사용할 ] 스레드 1 등으로 on._ 당신은 더 나은, 더 나은 아직 사용을 캐시 줄 경계에 각 요소를 정렬하거나, 여러 개의 CPU에서 배열을 수정할 경우, CPU에서 CPU에 수신 거부 캐시 라인을해야 ← @ drhirsch의 접근 방식. – ninjalj