Я так близок к тому, чтобы закончить это, я думаю (?) Я думаю, что моя проблема заключается в понимании того, как блоки и сетки работают в функции.
K должно быть 25. и я должен варьироватьсяколичество блоков и количество потоков в блоке. Как правильно написать это в ядре func с Python
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy as np
mod = SourceModule('''#include "cuda_runtime.h"
__global__ void bitonic_sort_step(float *dev_values, int j, int k)
{
unsigned int i, ixj; /* Sorting partners: i and ixj */
i = threadIdx.x + blockDim.x * blockIdx.x;
ixj = i^j;
/* The threads with the lowest ids sort the array. */
if ((ixj) > i)
{
if ((i&k) == 0)
{
/* Sort ascending */
if (dev_values[i]>dev_values[ixj])
{
/* exchange(i,ixj); */
float temp = dev_values[i];
dev_values[i] = dev_values[ixj];
dev_values[ixj] = temp;
}
}
if ((i&k) != 0)
{
/* Sort descending */
if (dev_values[i]<dev_values[ixj])
{
/* exchange(i,ixj); */
float temp = dev_values[i];
dev_values[i] = dev_values[ixj];
dev_values[ixj] = temp;
}
}
}
}
''')
func = mod.get_function("bitonic_sort_step")
NUM_VALS = 33554432
a = np.random.rand(NUM_VALS)
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu,a)
BLOCKS = (524288,1,1)
THREADS = (64,1,1)
i = 2
while(i <= NUM_VALS):
j = i/2
while(j > 0):
func(a_gpu,j,i,block =THREADS,grid = BLOCKS)
j = j/2
i = i*2
a_sorted = np.empty_like(a)
cuda.memcpy_dtoh(a_sorted,a_gpu)
print(a)
print(a_sorted)
он говорит LogicError: cuFuncSetBlockShape ошибка: неверный аргумент