pyperlin
GPU accelerated Perlin Noise in python
Limitation: resolutions needs to divide shape
Using pytoch as the array backend makes the GPU acceleration trivial. Also it uses batch sampling to better use parallelization.
By playing with the parameters of Perlin noise, it is possible to create different textures. (code at the bottom)
Installation
pip install pyperlin
Usage
import torch
from pyperlin import FractalPerlin2D
shape = (32,256,256) #for batch size = 32 and noises' shape = (256,256)
resolutions = [(2**i,2**i) for i in range(1,7)] #for lacunarity = 2.0
factors = [.5**i for i in range(6)] #for persistence = 0.5
g_cuda = torch.Generator(device='cuda') #for GPU acceleration
fp = FractalPerlin2D(shape, resolutions, factors, generator=g_cuda)
noise = fp() #sampling
Benchmarks
CPU: Intel(R) Core(TM) i7-6850K CPU @ 3.60GHz
GPU: Nvidia Titan XP
| Algorithms | (1,256,256);1octaves | (1,256,256);6octaves | (32,256,256);6octaves | (32,1024,1024);8octaves |
|---|---|---|---|---|
| noise.pnoise2 | 73.8 ms | 86.3 ms | 2.85 s | 48 s |
| pyperlin.FractalPerlin2D (cpu) | 1.15 ms | 11.5 ms | 377 ms | 8.49 s |
| pyperlin.FractalPerlin2D (gpu) | 481 µs | 2.84 ms | 16.8 ms | 121 ms |
More Examples
import torch
from pyperlin import FractalPerlin2D
import matplotlib.pyplot as plt
shape = (1,1024,1024) #for batch size = 1 and noises' shape = (1024,1024)
factors = [.5**i for i in range(8)] #for persistence = 0.5
g_cuda = torch.Generator(device='cuda') #for GPU acceleration
clouds_resolutions = [(2**i,2**i) for i in range(1,7)] #for lacunarity = 2.0
clouds_factors = [.5**i for i in range(6)] #for persistence = 0.5
clouds = FractalPerlin2D(shape, clouds_resolutions, clouds_factors, generator=g_cuda)().cpu().numpy()[0]
fire_resolutions = [(2**i,4**i) for i in range(1,4)] #for lacunarity = 2.0 and 4.0
fire_factors = [.5**i for i in range(3)] #for persistence = 0.5
fire = FractalPerlin2D(shape, fire_resolutions, fire_factors, generator=g_cuda)().cpu().numpy()[0]
fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(121)
ax1.set_axis_off()
ax1.set_title('Clouds')
ax1.imshow(clouds, vmax=1.2, cmap=plt.get_cmap('Blues'))
ax2 = fig.add_subplot(122)
ax2.set_axis_off()
ax2.set_title('Fire')
ax2.imshow(fire, vmax=.3, cmap=plt.get_cmap('YlOrBr'))
fig.show()
Metadata
Release files for pyperlin 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pyperlin-1.1.0.tar.gz | 4.0 kB | Without provenance | Details for pyperlin-1.1.0.tar.gz |
Release files / pyperlin-1.1.0.tar.gz
| Download URL | pyperlin-1.1.0.tar.gz |
|---|---|
| Size | 4.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d361335d49e180cf333f637c4e55885e8b917497bdd5d5a661993329b9dd1742
|
|
BLAKE2b-256 checksum How to use checksums |
8b2c215d6ddf8d775e48ae9607a7e9d37f4b6c3ad3998023c3916d03338a1961
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.6.0 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.0
|
Security for pyperlin 1.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.