2990WX review thread Its live !

Page 3 - Seeking answers? Join the AnandTech community: where nearly half-a-million members share solutions and discuss the latest tech.

ub4ty

Senior member
Jun 21, 2017
749
898
96
Look, if you want to be exact then yes everyone with a brain (on forums like these) understands IPC is dependant on the software and instructions used, different architecture has its strengths and weakness in different software, even the software has different optimisations for different manufacturers, dependant on favouritism and/or funding.
IPC is a metric that refers to very specific micro-architectural details beyond the purview of the average person with a brain. It's why degrees are formulated around such talk... And I'm speaking of graduate degrees. Outside of the context of discussing micro-architecture and pipelines, it is a non-sensical point of discussion. This is non-obvious to a person without a degree in computer engineering which is why I tried to detail the complexity and nature of the measure. You can disagree. If you do, I ask you to enlighten me on what I'm missing....

What does the mention of IPC mean in 100% of the mainstream reviews floating around the internet besides a high level measure of how long a benchmark took? As such, why mention IPC at all? Instead of just K.I.S.S and say : This processor took 10min. The other took 15min. This processor is 50% faster than the other
.

You have no clue what the actual IPC is by such a measure. Zero. So, why mention it?

But for getting a general idea of a processors IPC in desktop workloads...to compare against previous or different processor's..then you certainly can go read a decent review and get a solid idea.
You can read an anandtech review for instance and know skylake is between 6-12% faster per clock than Zen.
To say all of it is complete bogus and worthless is in itself quite bogus.
No, you actually don't have a general idea of what IPC is for a previous or different processor. All you have is a figure of how long it took on one processor vs another and that's all you need to make a decision. If you want to have an accurate discussion about IPC, you have to drill down into the micro-architecture and pipeline and get very specific about what block of instruction flows have what kind of flow rate and why? Is it due to memory stalls? Branch prediction algorithm? etc etc...

You can read an anandtech review for instance and know skylake is between 6-12% faster per clock than Zen. To say all of it is complete bogus and worthless is in itself quite bogus
Faster per clock in executing a benchmark is not Instructions per clock. Please appreciate the difference. You have no clue what the actual varied flow per varied instruction is. This is exactly where the misinformation sets in. Quantum physics is Quantum physics. Trying to refer to very strict and detailed micro-architectural measures in such a glossed over populist manner is grandiose disinformation.

The number of instructions executed per clock is not a constant for a given processor; it depends on how the particular software being run interacts with the processor, and indeed the entire machine, particularly the memory hierarchy.
https://en.wikipedia.org/wiki/Instructions_per_cycle

https://www.expobrain.net/2013/06/19/disassembly-c-code-for-fun-part-2/

Code
#include <stdio.h>

int main()
{
printf("Hello world!");
return 0;
}

Compile and disassembly:

$ cc -g main.c
$ gdb a.out
Dump of assembler code for function main:
0x0000000100000f00 <main+0>: push %rbp
0x0000000100000f01 <main+1>: mov %rsp,%rbp
0x0000000100000f04 <main+4>: sub $0x10,%rsp
0x0000000100000f08 <main+8>: lea 0x51(%rip),%rdi # 0x100000f60
0x0000000100000f0f <main+15>: movl $0x0,-0x4(%rbp)
0x0000000100000f16 <main+22>: mov $0x0,%al
0x0000000100000f18 <main+24>: callq 0x100000f34 <dyld_stub_printf>
0x0000000100000f1d <main+29>: mov $0x0,%ecx
0x0000000100000f22 <main+34>: mov %eax,-0x8(%rbp)
0x0000000100000f25 <main+37>: mov %ecx,%eax
0x0000000100000f27 <main+39>: add $0x10,%rsp
0x0000000100000f2b <main+43>: pop %rbp
0x0000000100000f2c <main+44>: retq
End of assembler dump.

These are the instructions for a simple printf program. I'm sure you don't need this lesson as you seem informed. Now extrapolate this to a benchmark application.

Analysis of an execution flow :
https://en.wikipedia.org/wiki/Cycles_per_instruction

Instruction level/micro-architecture analysis is very complex and detailed and gets reflected in fixed and published official numbers. This is not something you bake into a review on a per benchmark basis to make your readers feel smarter than they are. This leads directly to a bunch of misinformed people talking far beyond their depth of understanding.

If you want an actual and proper discussion about instruction level performance, you do the following :
https://en.wikipedia.org/wiki/Cycles_per_instruction
For the multi-cycle MIPS, there are five types of instructions:
  • Load (5 cycles)
  • Store (4 cycles)
  • R-type (4 cycles)
  • Branch (3 cycles)
  • Jump (3 cycles)
If a program has:
  • 50% load instructions
  • 25% store instructions
  • 15% R-type instructions
  • 8% branch instructions
  • 2% jump instructions
then, the CPI is:


This doesn't even get into advanced processor performance but is a basic high level of instruction performance.

This is what a series of ISA/software guide books look like for instruction level granularity :



So, I'll restate : IPC measures in populist reviews are bogus. K.I.S.S : Processor X completes benchmark Y this fast. It is K% faster than Processor A,B,C,1,2,3.That's all people care about and can interpret. If you want to start with derivation analysis.. specify this and specify how you arrived at your derivation.

If you're not going to measure something properly, don't refer to it at all. If it has no relevance, leave it out. If something can be summarized using something far simpler, go for simple. Why would you ever further complicate and be wrong about something when the answer was already simply given to you ?

So, that's IPC.... I hope this unofficial and likely wrong uncore/Interconnect power utilization analysis doesn't also become a meme.
 
Last edited:

Triloby

Senior member
Mar 18, 2016
587
275
136

Bloody hell. The 2990WX on Linux is a beast in comparison to the 7980XE. I wonder if anyone else has run similar tests with the 2990WX on Linux?

Because this tells a very different story compared to the 2990WX on Windows, which is very disappointing. Maybe it's a scheduling issue on Windows, or the programs being used in Windows can't really scale well beyond a certain threshold of cores? Either way, it's a major night and day difference.
 

SPBHM

Diamond Member
Sep 12, 2012
5,058
410
126
Anandtechs review has the 32 core EPYC 7601, and yes memory is great on that thing.

right! not sure how I didn't notice...
but the results are a little difficult to read 100%, Epyc is running at a much lower clock and ram, if anyone could test at the same clock I think it would be clearer, but it looks mixed, some stuff runs a lot better on Epyc even with much lower clock, while others are poor on both even when the 18 core intel chip is clearly scaling nicely, so more than 16 cores are being used and still Epyc/TR 32c are behind 16c TR....

I guess both the memory configuration is very negative, and IF is not that well suited for 4 dies!
 

french toast

Senior member
Feb 22, 2017
988
825
136
IPC is a metric that refers to very specific micro-architectural details beyond the purview of the average person with a brain. It's why degrees are formulated around such talk... And I'm speaking of graduate degrees. Outside of the context of discussing micro-architecture and pipelines, it is a non-sensical point of discussion. This is non-obvious to a person without a degree in computer engineering which is why I tried to detail the complexity and nature of the measure. You can disagree. If you do, I ask you to enlighten me on what I'm missing....

What does the mention of IPC mean in 100% of the mainstream reviews floating around the internet besides a high level measure of how long a benchmark took? As such, why mention IPC at all? Instead of just K.I.S.S and say : This processor took 10min. The other took 15min. This processor is 50% faster than the other
.

You have no clue what the actual IPC is by such a measure. Zero. So, why mention it?


No, you actually don't have a general idea of what IPC is for a previous or different processor. All you have is a figure of how long it took on one processor vs another and that's all you need to make a decision. If you want to have an accurate discussion about IPC, you have to drill down into the micro-architecture and pipeline and get very specific about what block of instruction flows have what kind of flow rate and why? Is it due to memory stalls? Branch prediction algorithm? etc etc...


Faster per clock in executing a benchmark is not Instructions per clock. Please appreciate the difference. You have no clue what the actual varied flow per varied instruction is. This is exactly where the misinformation sets in. Quantum physics is Quantum physics. Trying to refer to very strict and detailed micro-architectural measures in such a glossed over populist manner is grandiose disinformation.

The number of instructions executed per clock is not a constant for a given processor; it depends on how the particular software being run interacts with the processor, and indeed the entire machine, particularly the memory hierarchy.
https://en.wikipedia.org/wiki/Instructions_per_cycle

https://www.expobrain.net/2013/06/19/disassembly-c-code-for-fun-part-2/



These are the instructions for a simple printf program. I'm sure you don't need this lesson as you seem informed. Now extrapolate this to a benchmark application.

Analysis of an execution flow :
https://en.wikipedia.org/wiki/Cycles_per_instruction

Instruction level/micro-architecture analysis is very complex and detailed and gets reflected in fixed and published official numbers. This is not something you bake into a review on a per benchmark basis to make your readers feel smarter than they are. This leads directly to a bunch of misinformed people talking far beyond their depth of understanding.

So, I'll restate : IPC measures in populist reviews are bogus. K.I.S.S : Processor X completes benchmark Y this fast. It is K% faster than Processor A,B,C,1,2,3.That's all people care about and can interpret.

If you claim otherwise, please explain yourself... Or maybe I'm just missing the fact that a term has been redefined in the mainstream world and has nothing to do w/ the original definition. I have no clue why such trends take place beyond something being taken out of context, misunderstood, and oversimplified for edginess. If you're not going to measure something properly, don't refer to it at all. If it has no relevance, leave it out. If something can be summarized using something far simpler, go for simple. Why would you ever further complicate something that is simple besides edge?
As I have stated, your definition of exactly what IPC is on a strict technical level is 100% correct, to get a proper idea of IPC you have to dial down to the amount of instructions a processor can process on a per software basis...using the strict definition you are right.
Mainstream tech has re purposed the term IPC for the amount of time a processor can complete a task at a certain clock...a handy easy to understand thing that can be used to compare processors..rather crudely from your perspective.

I'm just saying you can get a solid idea of the performance per clock speed of a processor by reading good tech reviews, and use them to compare products, the term 'IPC' may be used differently from the strict technical definition as you elequontly explained, but in mainstream tech circles it has merritt and can be quantified.

This can be done through various benchmarks that stress different parts of the CPU..cache tests, throughput tests, integer and FP tests, branch prediction etc, you can get a good idea of a cpu relative performance per clock...such as the stilts brilliant testing using 10-15 benchmarks...you can see ryzen is 10-15% behind skylake in performance per clock, depending on the benchmark.

But yes I accept IPC in the strict term is not the same as performance per clock (measured in time to complete usually) when discussing mainstream benchmarks.

Edit; I will say this though, from a high level I understand the need for certain topologies to extend multicore scaling as much as possible, at least until amdahl's law makes the whole thing pointless.
I'm just pointing out that this current CCX/infinity fabric/organic substrate set up for AMD is not the best case scenario for amd on desktop, at least from a performance perspective.

The uncore of ryzen consumes more power than intel ring bus topology, especially in low core utilisation scenarios, it even's out 12-32 cores somewhat, but using infinity fabricvto connect many cores is not efficient as I feel an interposer + butter donut would be.

Cost is another talking point, for sure it would be more expensive.
AMD has made the right choices for now, but two years into the future when intel has icelake SP, EMIB, likely new protocols and topologies, AMD is going to need a better system.
Connecting many small CCX on a die, then connecting many dice is going to cost alot of power and latency, it is crucial they get it right, which I'm sure they will continue to do so.
 
Last edited:

dnavas

Senior member
Feb 25, 2017
355
190
116
At least on desktop yes, the fabric is linked to the IMC in a 2:1 ratio if i remember, not sure about Epyc.
Would making a chart be interesting? For power consumption? It would be interesting but I'm not sure you can derive anything conclusive from it, without proper testing how would isolate the core+ uncore from the IF power consumption?

Well, maybe idle power consumption would say something (what exactly, though, is and is not down-clocked at idle?), but yeah, that's about as I figured. I'd love to know whether 3600 RAM is worth buying over 3200 -- does the higher power consumption offset core clocking headroom, but it isn't going to be architecturally enlightening.
But then, maybe that doesn't matter. If I knew I was going to lose 100Mhz on > 12 cores vs 400Mhz on the RAM (for example), that'd be enough.
 

french toast

Senior member
Feb 22, 2017
988
825
136
Well, maybe idle power consumption would say something (what exactly, though, is and is not down-clocked at idle?), but yeah, that's about as I figured. I'd love to know whether 3600 RAM is worth buying over 3200 -- does the higher power consumption offset core clocking headroom, but it isn't going to be architecturally enlightening.
But then, maybe that doesn't matter. If I knew I was going to lose 100Mhz on > 12 cores vs 400Mhz on the RAM (for example), that'd be enough.
The man you should ask for this would be the stilt, he likely has already tested for this or something similar.
He has configured and tested different ram speeds and timings, as well as O/C, power and temps.
Off memory I think he suggested 3400 cl 14 is a good trade off, my memory could be off though ...look in strictly technical section and ask him.
 
Reactions: dnavas

ub4ty

Senior member
Jun 21, 2017
749
898
96
As I have stated, your definition of exactly what IPC is on a strict technical level is 100% correct, to get a proper idea of IPC you have to dial down to the amount of instructions a processor can process on a per software basis...using the strict definition you are right.
Mainstream tech has re purposed the term IPC for the amount of time a processor can complete a task at a certain clock...a handy easy to understand thing that can be used to compare processors..rather crudely from your perspective.
They need to come up with a better acronym and name then.
Performance Per Clock (PPC) is an obvious one. It avoids confusion with the proper and strictly technical term of Instructions Per clock and is simpler for readers advanced/non-advanced alike. There's no question of what an instruction is and there's no question that it doesn't belong in this measure as it isn't actually being measured in any shape or form.

I'm just saying you can get a solid idea of the performance per clock speed of a processor by reading good tech reviews, and use them to compare products, the term 'IPC' may be used differently from the strict technical definition as you elequontly explained, but in mainstream tech circles it has merritt and can be quantified.
You just said it yourself ... Performance Per clock (PPC).
Again, K.I.S.S. Has a nice ring to it. No ambiguity and clearly conveys what it refers to.

This can be done through various benchmarks that stress different parts of the CPU..cache tests, throughput tests, integer and FP tests, branch prediction etc, you can get a good idea of a cpu relative performance per clock...such as the stilts brilliant testing using 10-15 benchmarks...you can see ryzen is 10-15% behind skylake in performance per clock, depending on the benchmark.

But yes I accept IPC in the strict term is not the same as performance per clock (measured in time to complete usually) when discussing mainstream benchmarks.
Again, if you're measuring Performance per clock which comes off the tongue far more easy then just call it that. Why go out of one's way to call it something else on top of this alternative name already being used in the same domain?

This seems to be a holdover term from the infamous bulldoozer days :
https://www.extremetech.com/computing/100583-analyzing-bulldozers-scaling-single-thread-performance

where it was used properly and the why was detailed (which you have to do w/ instruction level performance analysis) :
In order to hit higher clockspeeds, AMD lengthened the CPU’s pipeline and increased latencies throughout the architecture...

the FX-8150 struggles to surpass Thuban in a number of tests while its IPC definitely took a hit.

In this case, it's used properly as you clearly see and was detailed. You shouldn't talk about instruction level performance without talking about micro-architecture details and pipelines because that's what settles IPC for a range of instructions. But yes, over-all I think you understand my perspective and now I understand that IPC in populist reviews is a meme term I should ignore (which I have been doing). Why ignore it? Because all I actually care about is how a processor performs in various workloads which is what has already been detailed. No one's going into the why, so I don't really care for a derived number. I don't look at clocks or core count.. I look at performance. If X performs better in memory bound operations and I have a memory bound workload primarily, then that's what I look for...

There is no swiss army knife architecture by the way. If you try to optimize too much for one type of instruction flow too heavily, it will suck balls at others.. AMD learned this when they went bonkers with Bulldoozer.
 
Last edited:

Markfw

Moderator Emeritus, Elite Member
May 16, 2002
25,751
14,781
136
The man you should ask for this would be the stilt, he likely has already tested for this or something similar.
He has configured and tested different ram speeds and timings, as well as O/C, power and temps.
Off memory I think he suggested 3400 cl 14 is a good trade off, my memory could be off though ...look in strictly technical section and ask him.
Some of the first tests I am doing is power draw at the wall idle and max load STOCK. Then OC'ed as best as a 360AIO can do, then with a water custom loop. And I have 3600 ram, 64 gig of it in 8 sticks. It will be in my builders thread when I get it done, sometime later this week.
 

french toast

Senior member
Feb 22, 2017
988
825
136
Some of the first tests I am doing is power draw at the wall idle and max load STOCK. Then OC'ed as best as a 360AIO can do, then with a water custom loop. And I have 3600 ram, 64 gig of it in 8 sticks. It will be in my builders thread when I get it done, sometime later this week.
Of course you are another candidate to answer this question, you practically run your own server farm as a hobby!
 

french toast

Senior member
Feb 22, 2017
988
825
136
Ok then, hence forth I shall not use the acronym 'IPC' in vain..my self termed 'PPC' shall take it's place.
Point taken.
 

Gideon

Golden Member
Nov 27, 2007
1,714
3,937
136
You forgot one of the biggest reasons to get this instead of EPYC 7601. PRICE ! $4600 vs $1800, almost one third the price.
But yes, the other reason is clocks and OC ability. I may not do 4 ghz due to power draw and heat, but 2.2 ghz ? vs at least 3.4 ?
I agree with the OC statement. EPYC 7551P however is $2100, though clocks significantly lower indeed
 
Reactions: moinmoin

ub4ty

Senior member
Jun 21, 2017
749
898
96
Something's definitely up with the windows scheduler. Phoronix also ran tests on Windows:
https://www.phoronix.com/scan.php?page=article&item=2990wx-linux-windows&num=1

Remember 7-zip compression being slow?


And here is Anand's result in comparison:


EDIT:
It's only fitting that the only place where Windows is faster, is Solitaire

KEK... Yep, all of my Ryzen wares up to Thread ripper runs on Linux.
I use windows 10, on my gaming PC. For serious software development that drifts into low level territory, linux is unequivocally where its at for a wealth of reasons. Phoronix does a lot of great benchmarking for processors such as these. You can also grab their suite and run it pretty easily yourself if you're curious. I'm happy also that anandtech has some very good HPC/scientific compute benchies.
 
Reactions: lightmanek

Markfw

Moderator Emeritus, Elite Member
May 16, 2002
25,751
14,781
136
After I do some benches, and get OC in BIOS set, my 2990WX will be running linux 24/7/365. This is after the custom loop, and I am sure its good for temps at whatever OC I land on. Windows is just where I have the tools to bench and check temps.
 

StefanR5R

Elite Member
Dec 10, 2016
5,690
8,263
136
You forgot one of the biggest reasons to get this instead of EPYC 7601. PRICE ! $4600 vs $1800, almost one third the price.
The EPYC 7000P variants, which are artificially limited to single socket servers, come at about half the price of equivalent EPYC 7000.
But yes, the other reason is clocks and OC ability. I may not do 4 ghz due to power draw and heat, but 2.2 ghz ? vs at least 3.4 ?
That's true for both 7000 and 7000P of course, but that's what enables the 170 or 180 W TDP of them.
Some of the first tests I am doing is power draw at the wall idle and max load STOCK. Then OC'ed as best as a 360AIO can do, then with a water custom loop. And I have 3600 ram, 64 gig of it in 8 sticks. It will be in my builders thread when I get it done, sometime later this week.
Igor Wallossek of tomshw.de tested five cooling solutions:
https://www.tomshw.de/2018/08/13/am...st-echter-fortschritt-mit-bis-zu-32-kernen/7/

(tomshardware.com purchased much of Igor's work for their own TR2 review, but neither did they mention the original tester/ author anywhere, nor did they use the entire content. E.g., Igor showed 7-zip compression and decompression, Paul Alcorn only compression.)

Note, unlike Igor's graph might suggest, a custom waterloop without chiller can easily cool far more than 400 W. (My own triple GPU host has been pulling near 1,200 W at the wall at occasion, for days, and it has a single serial loop, with a single pump even.) Igor's custom loop had the processor run into the processor's temperature limit, not the power limit. It's anyone's guess whether larger radiators, perhaps combined with higher pump performance, would have gotten more out of the 2990WX without resorting to the chiller.
 
Last edited:

IEC

Elite Member
Super Moderator
Jun 10, 2004
14,362
5,026
136
Seems like Linux is the way to go for the 2990WX. It's in a class of its own as far as workstation loads.

2950X seems like the best offering for a true "HEDT" class part. One where you don't make the big compromises necessary for the "W" parts.

Also, at least some of the questionable performance on the part of the 2990WX appears to be due to Windows scheduler issues:
Und auch mit 64 Threads müssen viele Programme überhaupt erst einmal umgehen können. Hier sei auch der Scheduler von Windows nicht unbeteiligt, so AMD. Zusammen mit Microsoft arbeitet man bereits daran, Windows für den Umgang mit mehr als 32 Threads auf Threadripper 2000 zu optimieren.

Per AMD, they are working with Microsoft on optimizing the Windows Scheduler for >32 threads such as with the 2990WX.
 
Reactions: lightmanek and ZGR

StefanR5R

Elite Member
Dec 10, 2016
5,690
8,263
136



golden curve:
temperature T_die with AMD (Coolermaster/ AVC?) Wraith Ripper, fan speed was up to 2,500 rpm, causing up to 45.6 dB(A) noise measured 1.6 feet away​
violet curve:
T_die with Enermax LiqTech 240 TR4​
cyan curve:
T_die with Alphacool Eisblock XPX block (not a TR4 block; customized for TR4 with a special retention bracket), Alphacool VPP655 pump, 1 or 2 Alphacool Nexxos UT60 Full Copper 480mm radiators, Phobya fans​
blue curve:
T_die with Alphacool Eiszeit 2000 Chiller switched into the loop​

no T_die curve for LN2 cooling, as this was sub zero

red dotted curve (clock averaged over all cores) applies to all five cooling solutions within their respective package power ranges

It's anyone's guess whether larger radiators, perhaps combined with higher pump performance, would have gotten more out of the 2990WX without resorting to the chiller.
OK, it seems radiator surface was not a bottleneck. But the waterblock could have been.
 

wahdangun

Golden Member
Feb 3, 2011
1,007
148
106
Yeah Cooper not fast enough to remove the heat from cpu, so maybe it's time for diamond coating water block?
 
Last edited:
Reactions: french toast

dlerious

Golden Member
Mar 4, 2004
1,815
734
136
Some of the first tests I am doing is power draw at the wall idle and max load STOCK. Then OC'ed as best as a 360AIO can do, then with a water custom loop. And I have 3600 ram, 64 gig of it in 8 sticks. It will be in my builders thread when I get it done, sometime later this week.
What kind of setup do you have for custom (waterblock, radiators, pump)?
 
sale-70-410-exam    | Exam-200-125-pdf    | we-sale-70-410-exam    | hot-sale-70-410-exam    | Latest-exam-700-603-Dumps    | Dumps-98-363-exams-date    | Certs-200-125-date    | Dumps-300-075-exams-date    | hot-sale-book-C8010-726-book    | Hot-Sale-200-310-Exam    | Exam-Description-200-310-dumps?    | hot-sale-book-200-125-book    | Latest-Updated-300-209-Exam    | Dumps-210-260-exams-date    | Download-200-125-Exam-PDF    | Exam-Description-300-101-dumps    | Certs-300-101-date    | Hot-Sale-300-075-Exam    | Latest-exam-200-125-Dumps    | Exam-Description-200-125-dumps    | Latest-Updated-300-075-Exam    | hot-sale-book-210-260-book    | Dumps-200-901-exams-date    | Certs-200-901-date    | Latest-exam-1Z0-062-Dumps    | Hot-Sale-1Z0-062-Exam    | Certs-CSSLP-date    | 100%-Pass-70-383-Exams    | Latest-JN0-360-real-exam-questions    | 100%-Pass-4A0-100-Real-Exam-Questions    | Dumps-300-135-exams-date    | Passed-200-105-Tech-Exams    | Latest-Updated-200-310-Exam    | Download-300-070-Exam-PDF    | Hot-Sale-JN0-360-Exam    | 100%-Pass-JN0-360-Exams    | 100%-Pass-JN0-360-Real-Exam-Questions    | Dumps-JN0-360-exams-date    | Exam-Description-1Z0-876-dumps    | Latest-exam-1Z0-876-Dumps    | Dumps-HPE0-Y53-exams-date    | 2017-Latest-HPE0-Y53-Exam    | 100%-Pass-HPE0-Y53-Real-Exam-Questions    | Pass-4A0-100-Exam    | Latest-4A0-100-Questions    | Dumps-98-365-exams-date    | 2017-Latest-98-365-Exam    | 100%-Pass-VCS-254-Exams    | 2017-Latest-VCS-273-Exam    | Dumps-200-355-exams-date    | 2017-Latest-300-320-Exam    | Pass-300-101-Exam    | 100%-Pass-300-115-Exams    |
http://www.portvapes.co.uk/    | http://www.portvapes.co.uk/    |