Как правильно использовать блоки и потоки в CUDA в классе C ++ - PullRequest
0 голосов
/ 28 июня 2019

Я не знаю, возможно ли это даже с CUDA (я новичок в программировании CUDA).Я хочу иметь ядро, которое выполняет некоторую параллельную работу (Test::work), но некоторые части этой работы также можно дополнительно распараллелить (stuff_that_can_be_done_in_parallel).

В приведенном ниже примере (псевдокод) запускядро с kernel<<<NBLOCKS,1>>>(d_test) работает как положено, но я не могу найти способ выполнить дальнейшее распараллеливание, выполнив что-то вроде: kernel<<<NBLOCKS,16>>>(d_test) для обработки shared_data с 16 потоками в блоке, 1 поток на элемент.

class Test {
public:
    __host__ void set_data(int[] d) { ... }
    __host__ __device__ void work() {
        while (condition) {
            ... do some stuff sequentially, calculating x
            for (int i=0; i<16; i++) {
                stuff_that_can_be_done_in_parallel(i, x);
            }
            [synchronize]
            and update m_data with the values of shared_data
        }
    }
    __host__ __device__ void stuff_that_can_be_done_in_parallel(int i, int x) {
        ... calculate shared_data
    }

    int m_data[NELEMENTS];
    int shared_data[16]; // how to properly declare this as __shared__ ? 
};

__global__ void kernel(Test* t)
{
    t[blockIdx.x].work();
}


int main() 
{
    Test *h_test[NBLOCKS], *d_test;
    h_test = new Test[NBLOCKS]
    for (int i=0; i<NBLOCKS; i++) h_test[i].set_data(...);
    cudaMalloc((void**)&d_test, NBLOCKS*sizeof(Test));
    cudaMemcpy(d_test, h_test, NBLOCKS*sizeof(Test), cudaMemcpyHostToDevice);   
    kernel<<<NBLOCKS,1>>>(d_test);
    cudaDeviceSynchronize();
    cudaMemcpy(h_test, d_test, NBLOCKS*sizeof(Test), cudaMemcpyDeviceToHost);   
    cudaFree(d_test);
    delete[] h_test;
    return 0;
}

1 Ответ

0 голосов
/ 30 июня 2019

Я нашел то, что искал. Это расширение CUDA, которое называется «динамический параллелизм CUDA». Спасибо всем за потраченное время и извините за неясный вопрос. Как я уже сказал, я очень плохо знаком с программированием в CUDA и в то время не знал, что на самом деле искал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...