Anonymous user
Parallel calculations: Difference between revisions
→{{header|Perl 6}}
No edit summary |
|||
Line 656:
<lang parigp>v=pareval(vector(1000,i,()->factor(2^i+1)[1,1]));
vecmin(v)</lang>
=={{header|OxygenBasic}}==
<lang oxygenbasic>
'CONFIGURATION
'=============
% max 8192 'Maximum amount of Prime Numbers (must be 2^n) (excluding 1 and 2)
% cores 4 'CPU cores available (limited to 4 here)
% share 2048 'Amount of numbers allocated to each core
'SETUP
'=====
'SOURCE DATA BUFFERS
sys primes[max]
sys numbers[max]
'RESULT BUFFER
double pp[max] 'main thread
'MULTITHREADING AND TIMING API
'=============================
extern lib "kernel32.dll"
'
void QueryPerformanceCounter(quad*c)
void QueryPerformanceFrequency(quad*freq)
sys CreateThread (sys lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, *lpThreadId)
dword WaitForMultipleObjects(sys nCount,*lpHandles, bWaitAll, dwMilliseconds)
bool CloseHandle(sys hObject)
void Sleep(sys dwMilliSeconds)
'
quad freq,t1,t2
QueryPerformanceFrequency freq
'MACROS AND FUNCTIONS
'====================
macro FindPrimes(p)
'==================
finit
sys n=1
sys c,k
do
n+=2
if c>=max then exit do
'
'IS IT DIVISIBLE BE ANY PREVIOUS PRIME
'
for k=1 to c
if frac(n/p[k])=0 then exit for
next
'
if k>c then
c++
p[c]=n 'STORE PRIME
end if
end do
end macro
macro ProcessNumbers(p,bb)
'=========================
finit
sys i,b,e
b=bb*share
e=b+share
sys v,w
for i=b+1 to e
v=numbers(i)
for j=max to 1 step -1
w=primes(j)
if w<v then
if frac(v/w)=0 then
p(i)=primes(j) 'store highest factor
exit for 'process next number
end if
end if
next
next
end macro
'THREAD FUNCTIONS
function threadA(sys v) as sys
ProcessNumbers(pp,v)
end function
function threadB(sys v) as sys
ProcessNumbers(pp,v)
end function
function threadC(sys v) as sys
ProcessNumbers(pp,v)
end function
end extern
function mainThread(sys b)
'===========================
ProcessNumbers(pp,b)
end function
'SOURCE DATA GENERATION
sys seed = 0x12345678
function Rnd() as sys
'====================
'
mov eax,seed
rol eax,7
imul eax,eax,13
mov seed,eax
return eax
end function
function GenerateNumbers()
'=========================
sys i,v,mask
mask=max * 8 -1 'as bit mask
for i=1 to max
v=rnd()
v and=mask
numbers(i)=v
next
end function
FindPrimes(primes)
GenerateNumbers()
% threads Cores-1
% INFINITE 0xFFFFFFFF 'Infinite timeout
sys Funs[threads]={@threadA,@threadB,@threadC} '3 additional threads
sys hThread[threads], id[threads], i
'
'
for i=1 to threads
hThread(i) = CreateThread 0,0,funs(i),i,0,id(i)
next
QueryPerformanceCounter t1
MainThread(0) 'process numbers in main thread (bottom share)
if threads>0 then
WaitForMultipleObjects Threads, hThread, 1, INFINITE
end if
for i=1 to Threads
CloseHandle hThread(i)
next
sys n,f
for i=1 to max
if pp(i)>f then f=pp(i) : n=i
next
QueryPerformanceCounter t2
print str((t2-t1)/freq,3) " secs " numbers(n) " " f 'number with highest prime factor
</lang>
=={{header|Perl 6}}==
|