Как передать блок и поток через функцию ядра? - PullRequest
0 голосов
/ 08 ноября 2019

Я так близок к тому, чтобы закончить это, я думаю (?) Я думаю, что моя проблема заключается в понимании того, как блоки и сетки работают в функции.

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 ошибка: неверный аргумент

...