私は Rootbeer の使い方を学んでいますが、そのサンプル アプリを実行したときに行き詰まり、誰も私の質問に答えることができませんでした: Rootbeer ランタイム エラー、修正方法は?
そこで、Rootbeer のソース コードをダウンロードし、コードを調べてみました。問題は [ CUDAContext.java:119 ] です。
public void setKernel(Kernel kernelTemplate) {
this.kernelTemplate = kernelTemplate;
[ 119 ] this.compiledKernel = (CompiledKernel) kernelTemplate;
}
Kernel と 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行目でキャストは適切に行われていますか?そうである場合、なぜ次のようなエラーが表示されたのですか。
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; }
}