내가 Rootbeer를 사용하는 배우고,하지만 난 그 샘플 응용 프로그램을 실행했을 때 내가 붙어있어, 아무도 내 질문에 대답하지 수 : Rootbeer runtime error, how to fix?Java에서 인터페이스를 올바르게 캐스팅하는 방법은 무엇입니까?
그래서 나는 Rootbeer의 소스 코드를 다운로드하고 코드를 살펴했다
public void setKernel(Kernel kernelTemplate) {
this.kernelTemplate = kernelTemplate;
[ 119 ] this.compiledKernel = (CompiledKernel) kernelTemplate;
}
그리고 커널과 CompiledKernel의 정의는 다음과 같습니다 :
public interface Kernel
{
public void gpuMethod();
}
public interface CompiledKernel
{
public String getCodeUnix();
public String getCodeWindows();
public int getNullPointerNumber();
public int getOutOfMemoryNumber();
public String getCubin32();
public int getCubin32Size();
public boolean getCubin32Error();
public String getCubin64();
public int getCubin64Size();
public boolean getCubin64Error();
public Serializer getSerializer(Memory memory,Memory memory1);
public boolean isUsingGarbageCollector();
}
라인 119에 제대로 캐스트가 문제가 [CUDAContext.java:119]이고, 여기? 그렇다면 다음과 같은 오류 메시지가 표시되는 이유는 무엇입니까?
java.lang.ClassCastException: ArrayMult cannot be cast to org.trifort.rootbeer.runtime.CompiledKernel
at org.trifort.rootbeer.runtime.CUDAContext.setKernel(CUDAContext.java:119)
올바르게 완료되지 않은 경우 캐스팅하는 올바른 방법은 무엇입니까?
편집 : 여기
import java.util.List;
import java.util.ArrayList;
import org.trifort.rootbeer.runtime.Kernel;
import org.trifort.rootbeer.runtime.Rootbeer;
public class ArrayMultApp
{
public ArrayMultApp()
{
int[] array=new int[10];
for (int i=0;i<array.length;++i) array[i]=i;
for (int i=0;i<array.length;++i) Out("start array["+i+"]: "+array[i]);
multArray(array);
for (int i=0;i<array.length;++i) Out("final array["+i+"]: "+array[i]);
}
public void multArray(int[] array)
{
try
{
List<Kernel> jobs=new ArrayList();
for (int i=0;i<array.length;++i) jobs.add(new ArrayMult(array,i));
Rootbeer rootbeer=new Rootbeer();
rootbeer.run(jobs);
}
catch (Exception e) { e.printStackTrace(); }
}
public static void main(String[] args) { ArrayMultApp app=new ArrayMultApp(); }
private static void out(String message) { System.out.print(message); }
private static void Out(String message) { System.out.println(message); }
}
class ArrayMult implements Kernel
{
private int[] m_source;
private int m_index;
public ArrayMult(int[] source,int index)
{
m_source=source;
m_index=index;
}
public void gpuMethod() { m_source[m_index]*=11; }
}
전달 된'Kernel' 객체는'CompiledKernel'도 구현하지 않습니다. 'CompiledKernel'이'Kernel'을 확장했다는 뜻입니까? –
개체를 형식이 아닌 형식으로 변환 할 수 없으므로 올바른 방법이 없습니다. 사과와 같은 오렌지를 사과로 바꾸는 적절한 방법은 무엇인가 묻는 것과 조금 같습니다. –
나는 컨텍스트를 올바르게 초기화하지 않았다고 생각한다. – neohope