3

我一直在忙于我的 mendelbrot 集生成器程序,该程序目前与 autojit(gpu 并行性)一起使用以提高性能。问题是,它仅在浮点足够精确时才有效。

有没有办法(或库)来提高浮点精度,并且仍然能够使用 autojit 的性能提升功能?

我已经尝试过 bigfloat (无法让它工作)和 mpmath (忽略 autojit,非常慢)。

我的程序:

import numpy
import threading
import math
import time
import os
import subprocess
import winsound
from numba import autojit
from PIL import Image
from mpmath import *

def drawSet(iterations,startX,startY):
    print("")
    print("Calculating Values, please wait".center(80))  
    global SIZEW, ZOOM, SIZEH
    def drawList(lista,iterations):
        global data,SIZEW,SIZEH,COLORS
        subprocess.call('cls',shell=True)
        print("")
        print("Drawing fractal, please wait".center(80))
        for y in range(0,SIZEH):
            for x in range(0,SIZEW):
                if lista[x][y]==iterations:
                    data[y,x] = [0,0,0]
                else:
                    data[y,x] = COLORS[lista[x][y]%(len(COLORS))]
    #----------------------------------------------
    @autojit
    def DoIters(x,y,iterations):
        c=complex(x,y)
        c1=complex(x,y)
        for i in range(iterations):
            c=c**2+c1
            if c.real**2+c.imag**2>=4:
                return i
        return iterations
    #-----------------------------------------------
    def constrNumbers(startX,startY,step,step2,iterations): #WORKS
        global SIZEW,SIZEH,PROGRESS, EPOCH, numbers
        PROGRESS+=1   
        y1=startY
        for y in range(SIZEH): #sumnjivo
            x1=startX
            for x in range(SIZEW):
                numbers[x][y]=DoIters(x1,y1,iterations)
                x1+=step2
            y1+=step
        drawList(numbers,iterations)
        img = Image.fromarray(data, 'RGB')
        img.save("mendelbrot_screens/"+str(EPOCH)+"/"+str(PROGRESS)+".gif")
    #----------------------------------------------
    step=(1/ZOOM)*(4/SIZEW)
    step2=step*(SIZEH/SIZEW)
    #----------------------------------------------
    numbers=[[-1 for y in range(SIZEH)] for x in range(SIZEW)]    
    constrNumbers(startX,startY,step,step2,iterations)

def updateSet(): #always works tested
    global ZOOM, ITERATIONS, FOCUSX, FOCUSY,SIZEW,SIZEH
    ITERATIONS=round(math.sqrt(abs(2*math.sqrt(abs(1-math.sqrt(5*ZOOM)))))*66.5)
    subprocess.call('cls',shell=True)
    moder=2/ZOOM
    startX=(FOCUSX-moder)*(SIZEW/SIZEH)
    startY=FOCUSY-moder
    drawSet(ITERATIONS, startX, startY)


#########################################################################################################
####GLOBALS
#---------------------------
#http://www.bretttolbert.com/projects/colorscale/
#Output: RGB values Integer [0-255] CSS syntax (array)
COLORS2=['rgb(230,46,68)', 'rgb(230,46,90)', 'rgb(230,46,112)', 'rgb(230,46,134)', 'rgb(230,46,156)', 'rgb(230,46,178)', 'rgb(230,46,200)', 'rgb(230,46,223)', 'rgb(215,46,230)', 'rgb(193,46,230)', 'rgb(171,46,230)', 'rgb(149,46,230)', 'rgb(127,46,230)', 'rgb(105,46,230)', 'rgb(83,46,230)', 'rgb(61,46,230)', 'rgb(46,53,230)', 'rgb(46,76,230)', 'rgb(46,98,230)', 'rgb(46,120,231)', 'rgb(46,142,231)', 'rgb(46,164,231)', 'rgb(46,186,231)', 'rgb(46,209,231)', 'rgb(46,231,231)', 'rgb(46,231,209)', 'rgb(46,231,187)', 'rgb(46,231,164)', 'rgb(46,231,142)', 'rgb(46,231,120)', 'rgb(46,231,98)', 'rgb(46,231,76)', 'rgb(46,231,54)', 'rgb(61,231,46)', 'rgb(83,231,46)', 'rgb(105,231,46)', 'rgb(128,231,46)', 'rgb(150,231,46)', 'rgb(172,231,46)', 'rgb(194,232,46)', 'rgb(217,232,46)', 'rgb(232,224,46)', 'rgb(232,202,46)', 'rgb(232,180,46)', 'rgb(232,158,46)', 'rgb(232,135,46)', 'rgb(232,113,46)', 'rgb(232,91,46)', 'rgb(232,69,46)', 'rgb(232,46,46)']
COLORS3=['rgb(121,175,218)', 'rgb(120,177,218)', 'rgb(118,179,217)', 'rgb(117,182,216)', 'rgb(115,184,215)', 'rgb(114,187,214)', 'rgb(112,189,214)', 'rgb(110,192,213)', 'rgb(109,194,212)', 'rgb(107,197,211)', 'rgb(106,200,210)', 'rgb(105,203,210)', 'rgb(103,205,209)', 'rgb(102,208,207)', 'rgb(100,207,203)', 'rgb(99,206,198)', 'rgb(97,205,194)', 'rgb(96,205,189)', 'rgb(94,204,184)', 'rgb(93,203,180)', 'rgb(92,202,175)', 'rgb(90,201,170)', 'rgb(89,201,165)', 'rgb(87,200,160)', 'rgb(86,199,155)', 'rgb(85,198,150)', 'rgb(83,197,145)', 'rgb(82,196,140)', 'rgb(81,196,135)', 'rgb(79,195,130)', 'rgb(78,194,125)', 'rgb(77,193,120)', 'rgb(75,192,114)', 'rgb(74,192,109)', 'rgb(73,191,104)', 'rgb(71,190,99)', 'rgb(70,189,93)', 'rgb(69,188,88)', 'rgb(68,187,83)', 'rgb(66,187,77)', 'rgb(65,186,72)', 'rgb(64,185,66)', 'rgb(65,184,63)', 'rgb(68,183,62)', 'rgb(71,183,60)', 'rgb(74,182,59)', 'rgb(77,181,58)', 'rgb(80,180,57)', 'rgb(83,179,56)', 'rgb(86,179,54)', 'rgb(90,178,53)', 'rgb(93,177,52)', 'rgb(96,176,51)', 'rgb(100,175,50)', 'rgb(103,174,49)', 'rgb(107,174,48)', 'rgb(110,173,47)', 'rgb(113,172,45)', 'rgb(117,171,44)', 'rgb(120,170,43)', 'rgb(124,170,42)', 'rgb(127,169,41)', 'rgb(131,168,40)', 'rgb(135,167,39)', 'rgb(138,166,38)', 'rgb(142,165,37)', 'rgb(145,165,36)', 'rgb(149,164,35)', 'rgb(153,163,34)', 'rgb(156,162,33)', 'rgb(160,161,32)', 'rgb(161,157,31)', 'rgb(160,152,30)', 'rgb(159,147,29)', 'rgb(158,141,28)', 'rgb(157,136,27)', 'rgb(156,131,26)', 'rgb(156,125,25)', 'rgb(155,120,24)', 'rgb(154,114,23)', 'rgb(153,109,23)', 'rgb(152,104,22)', 'rgb(152,98,21)', 'rgb(151,93,20)', 'rgb(150,87,19)', 'rgb(149,82,18)', 'rgb(148,77,17)', 'rgb(147,71,16)', 'rgb(147,66,16)', 'rgb(146,60,15)', 'rgb(145,55,14)', 'rgb(144,50,13)', 'rgb(143,44,12)', 'rgb(143,39,11)', 'rgb(142,34,11)', 'rgb(141,28,10)', 'rgb(140,23,9)', 'rgb(139,18,8)', 'rgb(139,12,8)', 'rgb(138,7,7)']
COLORS4=['rgb(191,0,0)', 'rgb(192,11,0)', 'rgb(192,23,0)', 'rgb(192,34,1)', 'rgb(193,45,1)', 'rgb(193,57,1)', 'rgb(194,68,1)', 'rgb(194,80,1)', 'rgb(194,91,2)', 'rgb(195,103,2)', 'rgb(195,114,2)', 'rgb(195,126,2)', 'rgb(196,137,2)', 'rgb(196,149,3)', 'rgb(197,161,3)', 'rgb(197,172,3)', 'rgb(197,184,3)', 'rgb(198,196,3)', 'rgb(189,198,4)', 'rgb(178,199,4)', 'rgb(167,199,4)', 'rgb(156,199,4)', 'rgb(145,200,4)', 'rgb(134,200,5)', 'rgb(123,200,5)', 'rgb(112,201,5)', 'rgb(101,201,5)', 'rgb(90,202,5)', 'rgb(79,202,6)', 'rgb(67,202,6)', 'rgb(56,203,6)', 'rgb(45,203,6)', 'rgb(34,203,7)', 'rgb(23,204,7)', 'rgb(11,204,7)', 'rgb(7,205,14)', 'rgb(7,205,26)', 'rgb(8,205,38)', 'rgb(8,206,49)', 'rgb(8,206,61)', 'rgb(8,207,73)', 'rgb(8,207,85)', 'rgb(9,207,97)', 'rgb(9,208,109)', 'rgb(9,208,120)', 'rgb(9,208,132)', 'rgb(10,209,144)', 'rgb(10,209,156)', 'rgb(10,210,168)', 'rgb(10,210,180)', 'rgb(11,210,192)', 'rgb(11,211,204)', 'rgb(11,206,211)', 'rgb(11,195,212)', 'rgb(11,184,212)', 'rgb(12,172,212)', 'rgb(12,161,213)', 'rgb(12,150,213)', 'rgb(12,138,213)', 'rgb(13,127,214)', 'rgb(13,116,214)', 'rgb(13,104,215)', 'rgb(13,93,215)', 'rgb(14,81,215)', 'rgb(14,70,216)', 'rgb(14,58,216)', 'rgb(14,47,216)', 'rgb(15,35,217)', 'rgb(15,24,217)', 'rgb(18,15,218)', 'rgb(30,15,218)', 'rgb(42,16,218)', 'rgb(54,16,219)', 'rgb(66,16,219)', 'rgb(78,16,220)', 'rgb(90,16,220)', 'rgb(102,17,220)', 'rgb(115,17,221)', 'rgb(127,17,221)', 'rgb(139,17,221)', 'rgb(151,18,222)', 'rgb(163,18,222)', 'rgb(176,18,223)', 'rgb(188,19,223)', 'rgb(200,19,223)', 'rgb(212,19,224)', 'rgb(224,19,224)', 'rgb(225,20,212)', 'rgb(225,20,201)', 'rgb(225,20,189)', 'rgb(226,20,177)', 'rgb(226,21,166)', 'rgb(226,21,154)', 'rgb(227,21,143)', 'rgb(227,21,131)', 'rgb(228,22,119)', 'rgb(228,22,108)', 'rgb(228,22,96)', 'rgb(229,22,84)', 'rgb(229,23,73)']
#---------------------------
COLORS=[]
for i in COLORS2:
    string2=i[4:]
    string3=string2[:len(string2)-1]
    lista1=string3.split(",")
    COLORS.append([int(lista1[0]),int(lista1[1]),int(lista1[2])])
#------
SIZEW=1080
SIZEH=1080
ZOOM=1 #can be up to 10**13, breaks afterwards
numbers=[[-1 for y in range(SIZEH)] for x in range(SIZEW)]  
FOCUSX=-1.7400623827933990522084416706582563829664172043617186687986241846118291964415305605484071833948322574345000825
FOCUSY=0.02817533977921104899241152114431950968753907674299060857040130959588017432409201863854008146585605536156950844
PROGRESS=-1
FIRSTTIME=1
XREAL=0
YREAL=0
READY=1
ITERATIONS=1
#--------------------------
EPOCH = int(time.time())
try:
    os.stat("mendelbrot_screens")
except:
    os.mkdir("mendelbrot_screens")

os.mkdir("mendelbrot_screens/"+str(EPOCH))
#---------------------------
data = numpy.zeros((SIZEW,SIZEH,3), dtype=numpy.uint8)  
updateSet()

编辑:程序将集合保存为图像,因为我要从中渲染视频。

4

0 回答 0