everyone.get_global_size (0) 컨트롤러가 작동하지 않습니다.
이__kernel void FuncionCL(__global char* in, __global char* out, __global int* S2)
{
__private int op1, op2, op3;
__private int C;
__private uint WorkDim, C2;
op1 = 1;
op2 = 2;
WorkDim = get_global_size(0);
__private int ID;
ID = get_global_id(0);
for(C = 0; C < 1000000; C++)
{
for(C2 = ID; C2 < 1000; C2 += WorkDim)
{
op3 = op1 + op2;
}
}
out[0] = 90;
out[1] = 89;
*S2 = (int) WorkDim;
}
그것은 응용 프로그램, 너무 그래픽 컨트롤러뿐만 아니라 충돌 :
나는이 커널을 얻었다. 나는 상수 값 '16'(get_global_size() 함수가 반환)에 대한 증분을 변경하면 코드가 제대로 실행됩니다. 뭐가 문제 야? 대신 8 번WorkDim = 16;
: 내가 가진 코드를 실행하면
는
WorkDim = get_global_size(0);
코드는 문제의 400 배 빠르게 실행됩니다. 왜 값이 같으면?
** 편집 : **, 코드가 너무 느리고 곱하기 이유가 왜 자, 이제 내가 아는 :
1.- 투숙.
2 개 .- 모든 스레드가 첫 번째 루프에서 같은 반복을 오른쪽 코드는 다음과 같습니다
이 FuncionCL 무효 __kernel (__ 글로벌 숯불 *에서, __global 문자 * 밖으로, __global INT * S2) { __private int op1, op2, op3; __private int C; __private uint WorkDim, C2; op1 = 1; op2 = 2; WorkDim = get_global_size (0); __private int ID; ID = get_global_id (0); 위한 (C = ID, C < 1,000,000; C + = WorkDim) 용 { (ID = C2, C2 < 1,000; C2 + = WorkDim) { OP3 = OP1, OP2 +; } } out [0] = 90; out [1] = 89; * S2 = (int) WorkDim; }
내 코드는 CPU보다 GPU에서 6.1 배 빠릅니다.
즉시 또는 일정 시간 후 (예 : 5 ~ 10 초) 충돌이 발생합니까? 후자의 경우, 커널이 너무 오래 걸리기 때문에 GPU를 재설정하는 것은 OS GPU 워치 독 타이머입니다. 이상적으로 커널이 50 밀리 초 미만으로 걸리게하거나 시스템 응답성에 영향을주기 시작하는 것이 이상적입니다 (UI 그리기 등에도 사용되기 때문에). – Dithermaster
답변 해 주셔서 감사합니다. 예, 5 초 후에 충돌합니다. 그러나 질문은 그 이유가 무엇입니까?마치 WorkDim의 값 대신 상수 값인 incrment를 사용하면 커널은 '16'(get_global_size (0)의 값을 반환)을 반환하지만 get_global_size (0)은 0을 반환하고 루프는 끝나지 않습니다. –