2017-02-19 32 views
0

При передаче моего указателя указать массив, я получаю ошибку foll: аргумент типа «float » несовместим с параметром типа «с плавающей точкой () [32768]CUDA: аргумент типа float * несовместим с параметром типа float (*) [32768]

соответствующие фрагменты моего кода являются:.

#define N 32768 

__global__ void op(float k_a[][N]) 
{ 
//some operation 
} 
float *ptr_a=(float*)malloc(N*N*sizeof(float)); 

float *d_ptr_a;cudaMalloc((void**)&d_ptr_a,N*N*sizeof(float)); 

cudaMemcpy(d_ptr_a,ptr_a,N*N*sizeof(float),cudaMemcpyHostToDevice); 

op<<<nblocks,nthreadsperblock>>>(d_ptr_a) 

Может кто-нибудь сказать мне, что происходит не так я новичок в CUDA

+0

Сообщение об ошибке очень явное - тип, который вы передаете в качестве аргумента, не совпадает с типом, требуемым ядром. – talonmies

+2

Я должен добавить, это не имеет ничего общего с CUDA. Если вы просто определяете регулярный 'void op (float k_a [] [N])' и передаете ему аргумент 'float * ', вы получаете то же (или подобное) сообщение об ошибке. Clang дает мне 'error: can not convert 'float *' to 'float (*) [32768]' для аргумента '1' to 'void op (float (*) [32768])'' – CygnusX1

+0

И почему 'k_a' должен быть этой «странной» вещью? Будет 'float *' не работать? – Matso

ответ

3

Что мы имеем здесь неправильное использование указателей и массивов. В соответствии с определением подпрограммы op требуется указатель для массива длины N типа float. С другой стороны, когда он называется , указатель для ввода float предоставляется в качестве аргумента, что приводит к появлению сообщения об ошибке типов, которые несовместимы.

Если op подлежит решению с 2D-массивом значений float, лучше иметь его аргумент в качестве указателя на float. В таком случае все из M «строк» ​​исходного 2D массива, доступ с индексом y, сидеть в памяти один за другим, в одной строке, как это:

[row0][row1][row2]...[rowM-1] 

Каждая такая строка содержит N "столбцы", доступ к которым осуществляется по индексу x. Для того, чтобы получить значение для некоторой пары (x, y) мы должны производить глобальный индекс, который будет иметь доступ к 1D массива:

index = y * N + x; 

просто.

+1

"* это требует ** массива массивов длины N ***" не совсем правильно. Для этого требуется * указатель * для массива длины N, который, как вы заметили, вероятно, будет сопровождаться другим массивом того же типа, то есть ожидается, что * указывает * на 1-й элемент «* массив массивов длины N * ". Это раскрывает концептуальную проблему, а именно, что рассматриваемая функция ('op()' здесь) * делает ** не ** знать второе измерение *! – alk

+0

@alk Хорошая точка - я исправлю ответ. – Matso