"각 스레드는 자기 주소를 정확히 요청한다" = 스레드가 자기가 처리할 데이터의 주소를 정확히 요청한다?
조금 더 정확히 쓰면:
각 스레드는 커널 코드에 의해 계산된 인덱스 i에 대해,
그에 해당하는 메모리 주소 &a[i]를 요청한다.
즉 “스레드가 메모리 안에서 자기 고유 주소를 가진다”가 아니라,
이게 정확한 그림.
둘 다 가능해. 커널이 어떻게 작성되었느냐에 따라 달라.
thread i → y[i] = f(x[i])
elementwise 연산에서 흔해.
예를 들어 “한 스레드가 연속 원소 4개” 처리:
thread t:
base = t * 4
처리: x[base], x[base+1], x[base+2], x[base+3]
이렇게 하면:
특히 벡터화(vectorized load) 같은 테크닉이 여기랑 연결돼.
스레드가 코드로는:
x[0], x[1000], x[2000] 같은 불연속 주소를 한 스레드가 읽기
왜냐하면:
즉 “가능/불가능”이 아니라 “빠르냐/느리냐” 문제.
대표적으로:
이런 건 “연속 접근”이 본질적으로 어려워서,
그 분야에서는 다른 최적화(캐싱, shared memory, sorting indices 등)를 따로 고민한다.
텐서의 dtype이 float32(4B)이고 contiguous라면
커널에서i = ... + thread_id로 인덱스를 정하고
각 스레드는&a[i]주소를 load 요청한다.
warp(32 threads)가 요청한 주소들이 연속 구간에 모이면
하드웨어가 이를 적은 수의 memory transaction으로 묶어(coalescing) 가져오며,
그 결과 메모리 효율과 성능이 좋아진다.