সুতরাং, মূলত, আপনি চান আপনার কোডটি দ্রুত চালিত হোক। জেএনআই এর উত্তর is আমি জানি আপনি বলেছিলেন এটি আপনার পক্ষে কাজ করে নি, তবে আমাকে ভুল দেখাতে দাও।
এখানে Dot.java
:
import java.nio.FloatBuffer;
import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.annotation.*;
@Platform(include = "Dot.h", compiler = "fastfpu")
public class Dot {
static { Loader.load(); }
static float[] a = new float[50], b = new float[50];
static float dot() {
float sum = 0;
for (int i = 0; i < 50; i++) {
sum += a[i]*b[i];
}
return sum;
}
static native @MemberGetter FloatPointer ac();
static native @MemberGetter FloatPointer bc();
static native @NoException float dotc();
public static void main(String[] args) {
FloatBuffer ab = ac().capacity(50).asBuffer();
FloatBuffer bb = bc().capacity(50).asBuffer();
for (int i = 0; i < 10000000; i++) {
a[i%50] = b[i%50] = dot();
float sum = dotc();
ab.put(i%50, sum);
bb.put(i%50, sum);
}
long t1 = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
a[i%50] = b[i%50] = dot();
}
long t2 = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
float sum = dotc();
ab.put(i%50, sum);
bb.put(i%50, sum);
}
long t3 = System.nanoTime();
System.out.println("dot(): " + (t2 - t1)/10000000 + " ns");
System.out.println("dotc(): " + (t3 - t2)/10000000 + " ns");
}
}
এবং Dot.h
:
float ac[50], bc[50];
inline float dotc() {
float sum = 0;
for (int i = 0; i < 50; i++) {
sum += ac[i]*bc[i];
}
return sum;
}
এই কমান্ডটি ব্যবহার করে আমরা জাভাসিপিপি দিয়ে এটি সংকলন ও পরিচালনা করতে পারি :
$ java -jar javacpp.jar Dot.java -exec
একটি ইন্টেল (আর) কোর (টিএম) আই 7-7700 এইচকিউ সিপিইউ @ 2.80GHz, ফেডোরা 30, জিসিসি 9.1.1, এবং ওপেনজেডিকে 8 বা 11 এর সাথে আমি এই ধরণের আউটপুট পাই:
dot(): 39 ns
dotc(): 16 ns
বা প্রায় 2.4 গুণ দ্রুত। অ্যারের পরিবর্তে আমাদের সরাসরি এনআইও বাফার ব্যবহার করা দরকার, তবে হটস্পট সরাসরি এনআইও বাফারগুলিকে অ্যারে হিসাবে দ্রুত অ্যাক্সেস করতে পারে । অন্যদিকে, লুপটি নিজে হাতে আনারোলিং করা এক্ষেত্রে পারফরম্যান্সে একটি পরিমাপযোগ্য উত্সাহ সরবরাহ করে না।
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilation
। আপনার এমন একটি প্রোগ্রামের প্রয়োজন হবে যা ভেটোরিজেবল পদ্ধতিটিকে "উত্তপ্ত" করতে পর্যাপ্ত সময় চালায়।