Я пытаюсь рассчитать перераспределение клеточных автоматов 2d с использованием Cuda. Я совершенно новичок в этом, поэтому не знаю, что я делаю неправильно. Я пробовал много решений, которые я видел здесь, но все они дают «недопустимый аргумент», когда я вызываю ядро.Cuda "invalid argument" 2d array - Сотовые автоматы
Вот упрощенная версия ядра:
//kernel definition
__global__ void stepCalc(float B[51][51], int L, int flag, float m, float en)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
int j = blockDim.y * blockIdx.y + threadIdx.y;
float g=B[i][j]-0.25*(B[i+1][j]+B[i-1][j]+B[i][j+1]+B[i][j-1]);
flag = 0;
if (i < L-2 && j < L-2 && i>2 && j>2 && abs(g)>m)
{
flag = 1;
en+=-16*g*g+8*B[i][j]*abs(g);
B[i][j]+=-4*f*g;
B[i+1][j]+=f*g;
B[i-1][j]+=f*g;
B[i][j+1]+=f*g;
B[i][j-1]+=f*g;
}
}
Основная функция выглядит следующим образом:
#define L 50
float B[L+1][L+1];
//initialize B[i][j]
float g=0;
int flag = 1;
float m=0.1;
float en = 0;
while (flag==1)
{
float (*dB)[L+1];
int *dFlag=NULL;
float *dEn=NULL;
cudaMalloc((void **)&dFlag,sizeof(int));
cudaMalloc((void **)&dEn,sizeof(float));
cudaMalloc((void **)&dB, ((L+1)*(L+1))*sizeof(float));
cudaMemcpy(dB, B, sizeB, cudaMemcpyHostToDevice);
cudaMemcpy(dFlag, &flag, sizeof(int), cudaMemcpyDeviceToHost);
cudaMemcpy(dEn, &en, sizeof(float), cudaMemcpyDeviceToHost);
dim3 threadsPerBlock(16,16);
dim3 numBlocks((L+1)/threadsPerBlock.x,(L+1)/threadsPerBlock.y);
stepCalc<<<numBlocks, threadsPerBlock>>>(dB, L, dflag, m, dEn);
GPUerrchk(cudaPeekAtLastError()); //gives "invalid argument" at this line
cudaMemcpy(B, (dB), sizeB, cudaMemcpyDeviceToHost);
cudaMemcpy(&flag, dFlag, sizeof(int), cudaMemcpyDeviceToHost);
cudaMemcpy(&en, dEn, sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(dB);
cudaFree(dFlag);
cudaFree(dEn);
}
Мне нужно извлечь новый массив B, значение флага и сумму " en 'по всем темам. Я даже близко к тому, как должно выглядеть решение? Возможно ли это? Я также попытался сделать массив хостов B как float ** B без везения.
SO [ожидает] (http://stackoverflow.com/help/on-topic), на вопросы, подобные этим ("почему не этот код работает?"), Что вы предоставляете [MCVE] (http://stackoverflow.com/help/mcve). Это должно быть то, что кто-то другой может копировать, вставлять, компилировать и запускать, не добавляя ничего или ничего не менять, и не видит ошибку. Вы вводили этот код в браузере? Вы используете 'dflag' для своих параметров ядра, но определили' dFlag'. Почему бы не вставить код, который вы фактически используете? Ваш метод использования 2D-массива в ядре не будет работать. Возможно, вы захотите выполнить поиск на CUDA 2D arrary. –