Restrições de tamanho da grade da Nvidia CUDA quando bidimensionais grade?

Olá a todos. Talvez a minha pergunta pode parecer, para muitos primeira vista, óbvio, mas eu ainda te chamou não considerar seu idiota, até que não vai ler até o fim.


Então, qual é o cerne da questão. Sabe-se da documentação do CUDA, tamanho de malha de execução do kernel tem limitações, que depende de um dispositivo específico. Na maioria das placas de vídeo modernas são o limite de igual 65535x65535x1. Em minhas placas de vídeo g210m e 8800gt é exatamente assim, eu testei. Mas nesse lugar eu conheci bastante estranha coisa — no meu programa, por alguma desconhecida para mim, porque não é possível iniciar o kernel, que teve a dimensão (inter-segmentos) mais 5808x5808 (este número pode ser menor dependendo do tamanho do bloco, eu escrevi um rigoroso máximo) ou mais 264х264 (se medir em unidades) — e o último número, invariavelmente. Como apenas o número de executados os blocos de flops a 265х265, o kernel é executado, cumpre, mas como resultado de sempre emite zero.

Depurador da Nvidia Nsight em silêncio, nenhum erro é lançada profiler gera resultados do trabalho, nas quais o kernel é iniciado. A restrição aparece em todas as placas de vídeo, em que eu iniciava o programa — no valor de 8 diferentes modelos (8400m g, 8800gt, 9600gso, 8500gt, 9600gt, ION, g210m, gf9300)


Então tudo isso sugere para mim que há limites, não só na dimensão da malha, mas e no número de filamentos de grade (afinal, o número de threads em um bloco existe — por que aqui a não ser). Só que nem oficial, nem tutorial Борескова/Харлмова, nem best practices guide nada esta conta não falam, simplesmente dizem que não há restrições, já anunciou, no início da questão.


Porque копаюсь eu com isso, cerca de duas horas por dia durante a semana, e nenhum progresso não, eu peço a ajuda — onde cavar? Todos os comentários são bem-vindas, se você precisa fazer algum tipo de refinamento — diga


Answers 1:

Share:


CyborgWolf
Answer 1

Só que verifiquei. Eu não consegui repetir o seu problema.
Tenho GTX470.
Então. Escreveu o kernel:

__global__ void testKernel( int* g_odata) 
{
  if(threadIdx.x==0)
  {
    g_odata[2*(blockIdx.y*gridDim.x+blockIdx.x)] = blockIdx.y;
    g_odata[2*(blockIdx.y*gridDim.x+blockIdx.x)+1] = blockIdx.x;
  }
}

Lançou-o no 8192х8192 e blocos de 1024 треда(em suas видяхах um máximo de 512 тредов no bloco, no fermi 1024):
    dim3  grid( 8192, 8192, 1);
    dim3  threads( 1024, 1, 1);
    testKernel<<< grid, threads, 0 >>>(  d_odata);

Naturalmente destacou a memória e т. п.
E recebeu o último elemento do array: 8191x8191.
Em números grandes, não testei, porque a memória termina :( Tem alguma lógica de implementar.

E não entendo de onde vem esses não são valores 265, 264?