Regarding PrioQueue
← Thread:User talk:Skilgannon/KDTree/Regarding PrioQueue/reply (4)
Ahh, nice stuff! Could you post both your current version of your tree and the code you're using for "garbage-creation"? I'm curious to do some tests with it.
Here is the garbage creation code:
public TestResult doTest(KNNImplementation algorithm, int numNeighbours, SampleData[] data, KNNPoint[][] solution) { TestResult result = new TestResult(algorithm.getName(), data.length, numNeighbours, solution); ArrayList<KNNPoint[]> neighbourLists = new ArrayList<KNNPoint[]>(); double sum = 0;//DEPENDENCY FOR GARBAGE int addCount = 0; for (SampleData sample : data) { if (sample.save) { long time = -System.nanoTime(); algorithm.addDataPoint(sample.entry); time += System.nanoTime(); result.recordAdd(time); addCount++; } if (sample.search) { long time = -System.nanoTime(); KNNPoint[] neighbourList = algorithm.getNearestNeighbors(sample.data, Math.min(numNeighbours, addCount)); time += System.nanoTime(); result.recordSearch(neighbourList, time); } //GARBAGE - vary size of array to vary effect - 0 should have no effect double[] garbageD = new double[1000]; int[] garbageI = new int[garbageD.length]; for(int i = 0; i < garbageD.length; i++){ garbageD[i] = Math.random(); garbageI[i] = (int)(Integer.MAX_VALUE*Math.random()); } for(int i = 0; i < garbageD.length; i++){ garbageD[i] *= garbageI[garbageD.length-1-i]; sum += garbageD[garbageD.length-1 - i]; garbageI[i] -= sum; } } if(sum == -1.0)//DEPENDENCY FOR GARBAGE System.out.println("Unlikely event, but cannot be eliminated."); return result; }
Hmm... I just tried running it, including your garbage-generation:
With the initially-uploaded version of your tree:
- #1 Rednaxela's kd-tree (3rd gen) [0.0281] - #2 Skilgannon's Cache-hit KDTree [0.0336] - #3 Rednaxela's kd-tree (2nd gen) [0.0347] - #4 Voidious' Linear search [0.5787]
With the newly-uploaded version of your tree:
- #1 Rednaxela's kd-tree (3rd gen) [0.0281] - #2 Skilgannon's Cache-hit KDTree [0.0292] - #3 Rednaxela's kd-tree (2nd gen) [0.0346] - #4 Voidious' Linear search [0.5756]
I'm running this version of KNN.jar with default options (all "yes", including standard data file and isolated processes), 40 nearest neighbors, 10 repetitions.
Could you maybe try running this jar file exactly as-is to see what that results in on your machine?
Here's what I get:
BEST RESULT: - #1 Skilgannon's Cache-hit KDTree [0.0285] - #2 Rednaxela's kd-tree (3rd gen) [0.0311] - #3 Rednaxela's kd-tree (2nd gen) [0.0326] - #4 Voidious' Linear search [0.4172]
Strange, it must have to do with cache sizes and RAM speeds.
Here is my CPU. I have 6GB of DDR3-1333, and java -version
gives me
java version "1.7.0" Java(TM) SE Runtime Environment (build 1.7.0-b147) Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)
I also have an SSD, if that changes anything. Anything stand out to you?
Here's the CPU I'm using. That was with 8GB of DDR3 running at 1066MHz, but that's intentionally underclocked by a lot. If I clock my memory up to it's rated frequency of 1600MHz the result is as follows:
- #1 Rednaxela's kd-tree (3rd gen) [0.0276] - #2 Skilgannon's Cache-hit KDTree [0.0288] - #3 Rednaxela's kd-tree (2nd gen) [0.0340] - #4 Voidious' Linear search [0.5593]
A little faster all around, but not much difference with memory clock rate it seems.
The AMD Phenom II I'm using has 6MB of L3 cache, 512kB of L2 cache per-core, completely seperate.
The Intel Core i5 you're using has 3MB of L3 cache, 256kB of L2 cache per-core, though it looks like supposedly intel has some method of allowing the two cores to access eachother's L2 cache.
Java version:
java version "1.7.0_40" OpenJDK Runtime Environment (IcedTea 2.4.1) (ArchLinux build 7.u40_2.4.1-1-x86_64) OpenJDK 64-Bit Server VM (build 24.0-b50, mixed mode)
I have my root partition running on an SSD with the /home partition running on a spinning disk, but I doubt the disk situation affects this benchmark at all in any case.
Edit: I also find it very interesting that you get better performance numbers for the linear search, whereas I get better performance numbers for all of the trees except yours is about the same, plus the gap between my 3rd and 2nd gen tree is much larger for me than it is for you.
Edit: Since you uploaded a small update to your code this morning I tried that also. The change was small, going from 0.0288 changing to 0.0284.
You do not have permission to edit this page, for the following reasons:
You can view and copy the source of this page.
Return to Thread:User talk:Skilgannon/KDTree/Regarding PrioQueue/reply (9).
Maybe that's why my linear search score is so much better than yours?
BTW, newest code is a little bit faster.
So, it turns out that if I use Oracle Java in Windows instead of OpenJDK on Linux, the performance is pretty different:
- #1 Skilgannon's Cache-hit KDTree [0.0275] - #2 Rednaxela's kd-tree (3rd gen) [0.0290] - #3 Rednaxela's kd-tree (2nd gen) [0.0309] - #4 Voidious' Linear search [0.5553]
The relative performance of things looks much more similar to what you saw, with a smaller difference between my 3rd and 2nd gen tree, with your one performing better.
Between OracleJava/Windows and OpenJDK/Linux, my 3rd gen tree and your cache-hit tree, swap places it seems.
java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
(Also turns out the server JVM is much better suited for the kd-tree test than the client JVM. Edited this post to switch the results to those using the server JVM)