2013-05-24 5 views
0

확인이 거대한 배열이 연결된 배열 TJ하지만 TJ의 길이가 J처리하여 여러개의 크기의 배열

에 대한

변수가있다 J의 각 요소에 대해 지금 전화

J

수 있습니다 예를 들어 secuencial 과정이

for(J=0;J<length(ARRAY_J)) 
do 
    for(T=0;T<length(ARRAY_TJ)) 
    do 
    ARRAY_RESULT[J]+=ARRAY_J[J]+ARRAY_TJ[T] 
    end 
end 

처럼 보일 것입니다 그래서 그래서 나는 2D 블록 내 스레드를 정리하면 나는 J의 스레드의 x 인덱스와 T에 대한 스레드의 y 인덱스를 사용할 수있는 생각

이제 J의 길이는 알지만 T의 길이는 다양하므로 Cuda에서 이것을 정의하는 방법을 모르겠습니다. 예를 들어

ARRAY_RESULT[blockidx.y*blockDim.y+threadidx.y]+=ARRAY_J[blockidx.y*blockDim.y+threadidx.y]+ARRAY_TJ[blockidx.x*blockDim.x+threadidx.x] 

그래서 내가 어떻게 ARRAY_TJ의 길이 변수를 고려 여기 블록의 크기를 정의 할 수 있을까? 최대 길이 ARRAY_TJ를 사용해야합니까? 그런데 위 코드와 같은 코드가 작동할까요? ARRAY_J의 각 값에 대해 길이 (ARRAY_TJ) 값의 합계를 계산합니까?

답변

1

가 나는 J 스레드 길이, 1D 블록을 사용하는 것이 더해야한다고 생각하고, 당신은 TJ의 두 번째 차원과 2 차원에서 그것을 시도 할 경우 각 스레드에

int thread = blockIdx.x * blockDim.x + threadIdx.x; 
for(T=0;T<length(ARRAY_TJ)) 
    ARRAY_RESULT[thread]+=ARRAY_J[thread]+ARRAY_TJ[T] 

을 배열에서 하나 이상의 스레드가 ARRAY_RESULT의 동일한 위치에 동시에 쓰고 (문제가있는 상태에서) cuda에서 중요한 섹션을 쉽게 관리 할 수 ​​없습니다.

+0

그래, 내 루프를 없애기가 어려울 것이라고 생각했습니다. 오 잘 고마워! – Atirag