Pergunta

Como eu precisava classificar grandes matrizes de números com o CUDA, vim junto com o uso de impulso. Até agora, tudo bem ... mas quando eu quero chamar um kernel "manuscrito", tendo um impulso :: host_vector contendo os dados?

Minha abordagem foi (está faltando (está faltando):

int CUDA_CountAndAdd_Kernel(thrust::host_vector<float> *samples, thrust::host_vector<int> *counts, int n) {

 thrust::device_ptr<float> dSamples = thrust::device_malloc<float>(n);
 thrust::copy(samples->begin(), samples->end(), dSamples);

 thrust::device_ptr<int> dCounts = thrust::device_malloc<int>(n);
 thrust::copy(counts->begin(), counts->end(), dCounts);

 float *dSamples_raw = thrust::raw_pointer_cast(dSamples);
 int *dCounts_raw = thrust::raw_pointer_cast(dCounts);

 CUDA_CountAndAdd_Kernel<<<1, n>>>(dSamples_raw, dCounts_raw);

 thrust::device_free(dCounts);
 thrust::device_free(dSamples);
}

O kernel se parece:

__global__ void CUDA_CountAndAdd_Kernel_Device(float *samples, int *counts) 

Mas a compilação falha com:

Erro: Argumento do tipo "Float **" é incompatível com o parâmetro do tipo "Thrust :: host_vector> *"

Huh?! Eu pensei que estava dando flutuação e ponteiros Raw? Ou eu estou esquecendo de alguma coisa?

Foi útil?

Solução

Você está chamando o kernel com o nome da função em que a chamada está, não o nome do kernel - daí a incompatibilidade de parâmetros.

Mudar:

CUDA_CountAndAdd_Kernel<<<1, n>>>(dSamples_raw, dCounts_raw);

para

CUDA_CountAndAdd_Kernel_Device<<<1, n>>>(dSamples_raw, dCounts_raw);

e veja o que acontece.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top