2013-04-18 2 views
1

나는 Aparapi (https://code.google.com/p/aparapi/)를 테스트 중이며 포함 된 샘플 중 하나의 이상한 동작을 보입니다. 샘플이 "add"입니다. 그것을 구축하고 실행하는 것은 괜찮습니다. GPU를 정말 Aparapi 샘플을 추가하십시오

if(!kernel.getExecutionMode().equals(Kernel.EXECUTION_MODE.GPU)){ 
    System.out.println("Kernel did not execute on the GPU!"); 
} 

를 사용하는 경우 또한 테스트를 위해 다음과 같은 코드를 삽입하고 그것을 잘 작동합니다. 하지만, 숫자 512에서 배열의 크기를 변경하려고하면보다 큰 999 (예 : 1000), 나는 다음과 같은 출력이 있습니다

final int size = 1000; 

    final float[] a = new float[size]; 
    final float[] b = new float[size]; 

    for (int i = 0; i < size; i++) { 
    a[i] = (float)(Math.random()*100); 
    b[i] = (float)(Math.random()*100); 
    } 

    final float[] sum = new float[size]; 

    Kernel kernel = new Kernel(){ 
    @Override public void run() { 
     int gid = getGlobalId(); 
     sum[gid] = a[gid] + b[gid]; 
    } 
    }; 

    Range range = Range.create(size); 
    kernel.execute(range); 

    System.out.println(kernel.getExecutionMode()); 
    if (!kernel.getExecutionMode().equals(Kernel.EXECUTION_MODE.GPU)){ 
    System.out.println("Kernel did not execute on the GPU!"); 
    } 

    kernel.dispose(); 
:

여기
!!!!!!! clEnqueueNDRangeKernel() failed invalid work group size 
after clEnqueueNDRangeKernel, globalSize[0] = 1000, localSize[0] = 128 
Apr 18, 2013 1:31:01 PM com.amd.aparapi.KernelRunner executeOpenCL 
WARNING: ### CL exec seems to have failed. Trying to revert to Java ### 
JTP 

Kernel did not execute on the GPU! 

내 코드입니다

} 제안 내가

Range range = Range.create(size, 128); 

를 사용하여 크기를 지정하려고

Google 그룹에서,하지만 아무것도 변경되지 않았습니다.

현재 Java 1.6.0_43을 사용하는 Mac OS X 10.8에서 실행됩니다. Aparapi 버전이 최신 버전입니다 (2012-01-23).

내가 누락 된 항목이 있습니까? 어떤 아이디어? 사전

답변

4

Aparapi에서

덕분에 오픈 CL에서 구현의 '격자 스타일'을 상속합니다. 실행 범위 (1024)를 지정하면 OpenCL은이 '범위'를 동일한 크기의 그룹으로 나눕니다. 가능하면 256 그룹 또는 128 그룹의 8 그룹 128

그룹 크기 이어야합니다 (따라서 assert (range % groupSize == 0)).

기본적으로 Aparapi는 내부적으로 그룹 크기를 선택합니다.

그러나 완전히

범위 R = Range.range를 사용하여 범위 및 그룹 크기를 지정하는 선택하고는 (N, 128)

당신은 n 개의 % 128 == 0을 보장 할 책임이 있습니다.

오류 때문에 Range.range (1000,128)를 선택한 것처럼 보입니다.

슬프게도 1000 % 128! = 0이므로이 범위는 실패합니다.

당신이에서 지정할 경우

범위 R = Range.range (N)

Aparapi가 유효한 그룹 크기를 선택합니다, n은 가장 높은 공통 요소를 찾아.

128을 두 번째 arg로 놓으십시오.

게리

+0

답변 해 주셔서 감사합니다. 나는 Range.create()에 128을 버렸고 모든 것이 128의 배수를 'size'변수로 사용하여 잘 동작합니다. Aparapi는 그룹 크기를 내부적으로 선택한다고 말했 읍니다. 그룹 크기는 범위의 요소 여야합니다. 그렇다면 왜 코드가 크기 = 999를 선택 하는가?999 % 128 = 103이지만 오류없이 GPU에서 실행됩니다. 항상 내 지역 크기의 배수를 사용해야합니까? localsize 값을 어떻게 찾을 수 있습니까? 고마워요. – besil

+0

Range.range (크기)의 단일 인수 버전 만 사용하십시오. Aparapi는 가장 큰 공통 요소를 선택합니다. 999의 경우 9 * 111과 같아야합니다. Aparapi가 Range.range (X, 128) 팩토리 메소드로 localsize 128을 사용하도록 제어하고 강요하는 것을 선택합니다. 여기 Aparapi는 귀하의 요청을 '존중합니다'. 그러나 OpenCL은 (당연히) 런타임시 요청을 거부하고 실행에 실패합니다. MacOSX에는 잘못된 그룹 크기를보고하는 장치 (GPU) 관련 문제에 대한 다양한 보고서가있었습니다. 당신이 이걸 때리고 있다고 확신하지 못합니다. 나는 Mac OSX를 가지고 있고 코드는 잘 작동한다. – gfrost

관련 문제