이벤트를 버퍼에 쓰는 단일 제작자 스레드와 버퍼에서 이벤트를받는 추가 단일 소비자 스레드가있는 프로젝트가 있습니다. 내 목표는이 작업을 단일 듀얼 코어 시스템에 최적화하여 최대 처리량을 얻는 것입니다.생산자/소비자 다중 스레드 환경에서 공유 버퍼 최적화
현재 간단한 lock-free 링 버퍼를 사용하고 있습니다 (하나의 소비자와 하나의 제작자 스레드 만 있으므로 잠금이 가능하지 않으므로 포인터는 단일 스레드에서만 업데이트됩니다).
#define BUF_SIZE 32768
struct buf_t { volatile int writepos; volatile void * buffer[BUF_SIZE];
volatile int readpos;) };
void produce (buf_t *b, void * e) {
int next = (b->writepos+1) % BUF_SIZE;
while (b->readpos == next); // queue is full. wait
b->buffer[b->writepos] = e; b->writepos = next;
}
void * consume (buf_t *b) {
while (b->readpos == b->writepos); // nothing to consume. wait
int next = (b->readpos+1) % BUF_SIZE;
void * res = b->buffer[b->readpos]; b->readpos = next;
return res;
}
buf_t *alloc() {
buf_t *b = (buf_t *)malloc(sizeof(buf_t));
b->writepos = 0; b->readpos = 0; return b;
}
그러나이 구현은 아직 충분히 빠르지 않으므로 추가로 최적화해야합니다. 나는 다른 BUF_SIZE
값을 시도하고 속도가 빨라졌다. 또한, buffer
과 buffer
뒤에 writepos
을 이동 했으므로 두 변수가 다른 속도로 된 다른 캐시 라인에 있는지 확인해야합니다.
내가 원하는 것은 약 400 %의 속도 향상입니다. 패딩 (padding)과 같은 것들을 사용해서 내가 어떻게 이룰 수 있었는지 아이디어가 있습니까?
"소비자가 하나이고 제작자 스레드가 하나 밖에 없으므로 잠금이 해제 될 수 있습니다."- 소비자와 제작자 스레드가 충돌하면 어떻게됩니까? –
busy-waits에서 얼마나 많은 CPU가 구워 집니까? –
@Marcelo Cantos : 좋은 지적입니다! –