Skip to content

Commit 044d71c

Browse files
authored
Merge pull request #2440 from krzeszew/krzeszew/numba-dpex-api-update-genetic-sample
Update Genetic Algorithm code sample according to new numba-dpex API syntax
2 parents 7af8d17 + 4522bea commit 044d71c

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed

AI-and-Analytics/Features-and-Functionality/IntelPython_GPU_numba-dpex_Genetic_Algorithm/IntelPython_GPU_numba-dpex_Genetic_Algorithm.ipynb

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@
348348
"\n",
349349
"The only par that differs form the standard implementation is the evaluation function.\n",
350350
"\n",
351-
"The most important part is to specify the global index of the computation. This is the current index of the computed chromosomes. This serves as a loop function across all chromosomes."
351+
"The most important part is to specify the index of the computation. This is the current index of the computed chromosomes. This serves as a loop function across all chromosomes."
352352
]
353353
},
354354
{
@@ -365,10 +365,11 @@
365365
"outputs": [],
366366
"source": [
367367
"import numba_dpex\n",
368+
"from numba_dpex import kernel_api\n",
368369
"\n",
369370
"@numba_dpex.kernel\n",
370-
"def eval_genomes_sycl_kernel(chromosomes, fitnesses, chrom_length):\n",
371-
" pos = numba_dpex.get_global_id(0)\n",
371+
"def eval_genomes_sycl_kernel(item: kernel_api.Item, chromosomes, fitnesses, chrom_length):\n",
372+
" pos = item.get_id(0)\n",
372373
" num_loops = 3000\n",
373374
" for i in range(num_loops):\n",
374375
" fitnesses[pos] += chromosomes[pos*chrom_length + 1]\n",
@@ -409,8 +410,9 @@
409410
" chromosomes_flat = chromosomes.flatten()\n",
410411
" chromosomes_flat_dpctl = dpnp.asarray(chromosomes_flat, device=\"gpu\")\n",
411412
" fitnesses_dpctl = dpnp.asarray(fitnesses, device=\"gpu\")\n",
412-
"\n",
413-
" eval_genomes_sycl_kernel[numba_dpex.Range(pop_size)](chromosomes_flat_dpctl, fitnesses_dpctl, chrom_size)\n",
413+
" \n",
414+
" exec_range = kernel_api.Range(pop_size)\n",
415+
" numba_dpex.call_kernel(eval_genomes_sycl_kernel, exec_range, chromosomes_flat_dpctl, fitnesses_dpctl, chrom_size)\n",
414416
" fitnesses = dpnp.asnumpy(fitnesses_dpctl)\n",
415417
" chromosomes = next_generation(chromosomes, fitnesses)\n",
416418
" fitnesses = np.zeros(pop_size, dtype=np.float32)\n",
@@ -544,7 +546,7 @@
544546
"\n",
545547
"The evaluate created generation we are calculating the full distance of the given path (chromosome). In this example, the lower the fitness value is, the better the chromosome. That's different from the general GA that we implemented.\n",
546548
"\n",
547-
"As in this example we are also using numba-dpex, we are using a global index like before."
549+
"As in this example we are also using numba-dpex, we are using an index like before."
548550
]
549551
},
550552
{
@@ -554,8 +556,8 @@
554556
"outputs": [],
555557
"source": [
556558
"@numba_dpex.kernel\n",
557-
"def eval_genomes_plain_TSP_SYCL(chromosomes, fitnesses, distances, pop_length):\n",
558-
" pos = numba_dpex.get_global_id(0)\n",
559+
"def eval_genomes_plain_TSP_SYCL(item: kernel_api.Item, chromosomes, fitnesses, distances, pop_length):\n",
560+
" pos = item.get_id(1)\n",
559561
" for j in range(pop_length-1):\n",
560562
" fitnesses[pos] += distances[int(chromosomes[pos, j]), int(chromosomes[pos, j+1])]\n"
561563
]
@@ -708,7 +710,8 @@
708710
" chromosomes_flat_dpctl = dpnp.asarray(chromosomes, device=\"gpu\")\n",
709711
" fitnesses_dpctl = dpnp.asarray(fitnesses.copy(), device=\"gpu\")\n",
710712
"\n",
711-
" eval_genomes_plain_TSP_SYCL[numba_dpex.Range(pop_size)](chromosomes_flat_dpctl, fitnesses_dpctl, distances_dpctl, pop_size)\n",
713+
" exec_range = kernel_api.Range(pop_size)\n",
714+
" numba_dpex.call_kernel(eval_genomes_plain_TSP_SYCL, exec_range, chromosomes_flat_dpctl, fitnesses_dpctl, distances_dpctl, pop_size)\n",
712715
" fitnesses = dpnp.asnumpy(fitnesses_dpctl)\n",
713716
" chromosomes = next_generation_TSP(chromosomes, fitnesses)\n",
714717
" fitnesses = np.zeros(pop_size, dtype=np.float32)\n",

AI-and-Analytics/Features-and-Functionality/IntelPython_GPU_numba-dpex_Genetic_Algorithm/IntelPython_GPU_numba-dpex_Genetic_Algorithm.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -260,16 +260,17 @@ def next_generation(chromosomes, fitnesses):
260260
#
261261
# The only par that differs form the standard implementation is the evaluation function.
262262
#
263-
# The most important part is to specify the global index of the computation. This is the current index of the computed chromosomes. This serves as a loop function across all chromosomes.
263+
# The most important part is to specify the index of the computation. This is the current index of the computed chromosomes. This serves as a loop function across all chromosomes.
264264

265265
# In[ ]:
266266

267267

268268
import numba_dpex
269+
from numba_dpex import kernel_api
269270

270271
@numba_dpex.kernel
271-
def eval_genomes_sycl_kernel(chromosomes, fitnesses, chrom_length):
272-
pos = numba_dpex.get_global_id(0)
272+
def eval_genomes_sycl_kernel(item: kernel_api.Item, chromosomes, fitnesses, chrom_length):
273+
pos = item.get_id(0)
273274
num_loops = 3000
274275
for i in range(num_loops):
275276
fitnesses[pos] += chromosomes[pos*chrom_length + 1]
@@ -300,7 +301,8 @@ def eval_genomes_sycl_kernel(chromosomes, fitnesses, chrom_length):
300301
chromosomes_flat_dpctl = dpnp.asarray(chromosomes_flat, device="gpu")
301302
fitnesses_dpctl = dpnp.asarray(fitnesses, device="gpu")
302303

303-
eval_genomes_sycl_kernel[numba_dpex.Range(pop_size)](chromosomes_flat_dpctl, fitnesses_dpctl, chrom_size)
304+
exec_range = kernel_api.Range(pop_size)
305+
numba_dpex.call_kernel(eval_genomes_sycl_kernel, exec_range, chromosomes_flat_dpctl, fitnesses_dpctl, chrom_size)
304306
fitnesses = dpnp.asnumpy(fitnesses_dpctl)
305307
chromosomes = next_generation(chromosomes, fitnesses)
306308
fitnesses = np.zeros(pop_size, dtype=np.float32)
@@ -398,14 +400,14 @@ def eval_genomes_sycl_kernel(chromosomes, fitnesses, chrom_length):
398400
#
399401
# The evaluate created generation we are calculating the full distance of the given path (chromosome). In this example, the lower the fitness value is, the better the chromosome. That's different from the general GA that we implemented.
400402
#
401-
# As in this example we are also using numba-dpex, we are using a global index like before.
403+
# As in this example we are also using numba-dpex, we are using an index like before.
402404

403405
# In[ ]:
404406

405407

406408
@numba_dpex.kernel
407-
def eval_genomes_plain_TSP_SYCL(chromosomes, fitnesses, distances, pop_length):
408-
pos = numba_dpex.get_global_id(0)
409+
def eval_genomes_plain_TSP_SYCL(item: kernel_api.Item, chromosomes, fitnesses, distances, pop_length):
410+
pos = item.get_id(1)
409411
for j in range(pop_length-1):
410412
fitnesses[pos] += distances[int(chromosomes[pos, j]), int(chromosomes[pos, j+1])]
411413

@@ -526,7 +528,8 @@ def next_generation_TSP(chromosomes, fitnesses):
526528
chromosomes_flat_dpctl = dpnp.asarray(chromosomes, device="gpu")
527529
fitnesses_dpctl = dpnp.asarray(fitnesses.copy(), device="gpu")
528530

529-
eval_genomes_plain_TSP_SYCL[numba_dpex.Range(pop_size)](chromosomes_flat_dpctl, fitnesses_dpctl, distances_dpctl, pop_size)
531+
exec_range = kernel_api.Range(pop_size)
532+
numba_dpex.call_kernel(eval_genomes_plain_TSP_SYCL, exec_range, chromosomes_flat_dpctl, fitnesses_dpctl, distances_dpctl, pop_size)
530533
fitnesses = dpnp.asnumpy(fitnesses_dpctl)
531534
chromosomes = next_generation_TSP(chromosomes, fitnesses)
532535
fitnesses = np.zeros(pop_size, dtype=np.float32)

0 commit comments

Comments
 (0)