Я не знаю, возможно ли это даже с 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;
}