홈>
CUDA가 처음인데 CUDA에 대한 NVIDIA 교사를 읽었으며 도움이 필요합니다. 다음 코드가 있습니다 :
//some includes
#define NUM_OF_ACCOMS 3360
#define SIZE_RING 16
#define NUM_OF_BIGRAMMS 256
//...some code...
for (i = 1; i <= SIZE_RING; i++) {
for (j = 1; j <= SIZE_RING; j++) {
if (j == i) continue;
for (k = 1; k <= SIZE_RING; k++) {
if (k == j || k == i) continue;
accoms_theta[indOfAccoms][0] = i - 1; accoms_theta[indOfAccoms][1] = j - 1; accoms_theta[indOfAccoms][2] = k - 1;
accoms_thetaFix[indOfAccoms][0] = i - 1; accoms_thetaFix[indOfAccoms][1] = j - 1; accoms_thetaFix[indOfAccoms][2] = k - 1;
results[indOfAccoms][0] = results[indOfAccoms][1] = results[indOfAccoms][2] = 0;
indOfAccoms++;
}
}
}
for (i = 0; i < SIZE_RING; i++)
for (j = 0; j < SIZE_RING; j++) {
bigramms[indOfBigramms][0] = i; bigramms[indOfBigramms][1] = j;
indOfBigramms++;
}
for (i = 0; i < NUM_OF_ACCOMS; i++) {
thetaArr[0] = accoms_theta[i][0]; thetaArr[1] = accoms_theta[i][1]; thetaArr[2] = accoms_theta[i][2];
d0 = thetaArr[2] - thetaArr[1]; d1 = thetaArr[2] - thetaArr[0];
if (d0 < 0)
d0 += SIZE_RING;
if (d1 < 0)
d1 += SIZE_RING;
for (j = 0; j < NUM_OF_ACCOMS; j++) {
theta_fixArr[0] = accoms_thetaFix[j][0]; theta_fixArr[1] = accoms_thetaFix[j][1]; theta_fixArr[2] = accoms_thetaFix[j][2];
d0_fix = theta_fixArr[2] - theta_fixArr[1]; d1_fix = theta_fixArr[2] - theta_fixArr[0];
count = 0;
if (d0_fix < 0)
d0_fix += SIZE_RING;
if (d1_fix < 0)
d1_fix += SIZE_RING;
for (k = 0; k < NUM_OF_BIGRAMMS; k++) {
diff0 = subst[(d0 + bigramms[k][0]) % SIZE_RING] - subst[bigramms[k][0]];
diff1 = subst[(d1 + bigramms[k][1]) % SIZE_RING] - subst[bigramms[k][1]];
if (diff0 < 0)
diff0 += SIZE_RING;
if (diff1 < 0)
diff1 += SIZE_RING;
if (diff0 == d0_fix && diff1 == d1_fix)
count++;
}
if (max < count) {
max = count;
results[indResults][0] = max; results[indResults][1] = i; results[indResults][2] = j;
count = 0;
indResults++;
}
}
}
보시다시피,
i
에는 두 가지 주요주기가 있습니다
그리고
j
변수.
accoms_theta
의 foreach 배열이 필요합니다.
accoms_thetaFix
에서 각 배열의 상태를 확인하십시오.
. (와이즈 와이즈)
subst
입니다
SIZE_RING 요소가 포함 된 배열). 글쎄 당신은
int
에 대한 필요
모든 배열을 확인하는 작업. CUDA를 처음 사용하므로 알고리즘을 병렬화하는 데 도움이 필요합니다.
내 장치에 대한 정보가 있습니다
2^30
GeForce GT730M
Compute Capability 3.5
Global Memory 2 GB
Shared Memory Per Block 48 KB
Max Threads Per Block 1024
Number of multiprocessors 2
Max Threads Dim 1024 : 1024 : 64
Max Grid Dim 2*(10 ^ 9) : 65535 : 65535
- 답변 # 1
관련 자료
- deno - 명령 줄을 사용하여 대화 형으로 작업 할 수 있습니까?
- amazon web services - aws-appsync에서 관계로 작업하는 방법은 무엇입니까?
- flutter - floatingaction 버튼 목록으로 작업하는 방법?
- JSON이 포함 된 Python 배열
- mariadb - SQL 및 다중 조인 또는 병합 작업 방법
- Angular 7에서 작동하도록 select2를 만드는 방법
- javascript - 실시간 업데이트를 위해 AJAX가 JSX와 올바르게 작동 할 수 있습니까?
- javascript - 내 코드가 forEach 메소드에서 작동하지 않습니다
- android - 룸에서 날짜 및 시간으로 작업하는 방법
- omnet++ - handlePositionUpdate가 RSU에서 작동하지 않습니다
- java - JSON과 배열 비교
- ruby on rails - 웹 소켓은 ws - //에서만 작동하지만 wss : //에서는 작동하지 않습니다
- java - 두 배열로 삽입 정렬
- textures - cudaTextureObject_t와 함께 CUDA tex1DFetch를 사용하는 방법은 무엇입니까?
- reactjs - MemoryRouter가 @ testing-library/react와 함께 작동하도록 할 수 없습니다
- amazon web services - CloudFront 사전 서명 URL을 사용하는 방법
- minOccurs maxOccurs가 dita와 작동하지 않습니까?
- javascript - 스위치에 문제가 있습니다 한 번만 작동하지만 두 번은 작동하지 않습니다
- php - 내 줌라 윌! 3x 확장은 Joomla와 함께 작동합니다! 25?
- 루프의 루프가 파이썬과 어떻게 작동합니까?
내가 계산하려고하는 것에 대한 구체적인 내용은 다루지 않겠지 만, 내가 할 수있는 일에 대해서는 제안 할 것이다.
CUDA (또는 OpenCL 또는 OpenMP에서도)의 직렬 알고리즘을 병렬화하는 간단한 방법은 "루프 병렬화"입니다. CUDA의 맥락에서 단일 스레드 대신 일부 인덱스 값을 반복하는 것을 의미합니다.i
의 다른 값에 대해 다른 GPU 스레드가 작동합니다. (또는-i
의 여러 값마다 하나의 스레드 ).이것은 중첩 루프로 수행 할 수 있습니다 (예 : 두 지수
그러나 '순진하게'이 작업은 당혹 스러울 정도로 평행 한 문제에 대해서만 가능합니다. 예를 들어 각 스레드에서 계산/기록 할 데이터간에 종속성이없는 경우 (예 :i
그리고i
커널 발사 그리드의 2 차원에 해당합니다.j
의 각 조합에 대해) 그리고i
). 또한 다른j
에 대해읽은데이터가 그리고i
동일한 데이터를 반복해서 읽지 못하게하여 성능이 저하되지 않도록 추가로주의해야합니다.이 접근법을 시도하십시오. 실패하거나 적용 할 수 없다는 결론에 도달하면 다른 질문을하십시오.이 질문에는이 질문에 대해 제공하지 않은 최소의 완전하고 검증 가능한 예가 필요합니다.
j