Я хочу изменить, чтобы плавать, чтобы удвоить в исходном коде CUDA - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу изменить число с плавающей точкой на удвоение. Я попытался изменить тип данных с плавающей запятой на удвоение, но это было не то, что я ожидал, и вызвало ошибку.

Мой исходный код ЗДЕСЬ

main
int *imgData_0;
int *imgData_1;
int *imgData_2;

dim3 dimGrid(6500);
dim3 dimBlock(256);

kernel<<<dimGrid,dimBlock,0,stream>>>(imgData_0,imgData_1,imgData_2);

kernel
__global__ void kernel(int *imgData_0,int *imgData_1, int *img_Data_2)
int n = threadIdx.x+blockIdx.x*256

double *imgData_f_0;  //original Data type is float
double *imgData_f_1;
double *imgData_f_2;
double *before_conv_x,*before_conv_y,*before_conv_z;

before_conv_x=(double*)imgData_0;
before_conv_y=(double*)imgData_1;
before_conv_z=(double*)imgData_2;

before_conv_x[n]=imgData_0[n]/4095.0;
before_conv_y[n]=imgData_1[n]/4095.0;
before_conv_z[n]=imgData_2[n]/4095.0;

Если он напечатан, некоторыезначения хорошие, но остальные странные.

[506] : 0.862027
before_conv_x[507] : 0.862027
before_conv_x[508] : 0.862027
before_conv_x[509] : 0.861050
before_conv_x[510] : 0.857143
before_conv_x[511] : 0.857631
before_conv_x[43296] : -403653.072283
before_conv_x[43297] : 261911.558242
before_conv_x[43298] : 513530.716728
before_conv_x[43299] : 261909.432234
before_conv_x[43300] : 120122.646398
before_conv_x[43301] : 261909.057143

Если я попробую это с помощью float, я получу правильные значения. Почему значение double появляется таким образом?

Проблема с памятью? или нить?

Я не знаю, почему.


РЕДАКТИРОВАТЬ

Я пробую это

range = IMAGE_SIZE_X * IMAGE_SIZE_Y;
double *before_conv_x = new double[range];
double *before_conv_y = new double[range];
double *before_conv_z = new double[range];

before_conv_x[n] = ((double)imgData_0[n]) / 4095.0;
before_conv_y[n] = ((double)imgData_1[n]) / 4095.0;
before_conv_z[n] = ((double)imgData_2[n]) / 4095.0;

, но это не сработало

Операция копируется после копирования данных imgData в before_conv_x

, поэтому я думаю

before_conv_x=(double*)imgData_0

, что является правильным кодом ... но почему не возвращать значение?

Отличается ли он от чтения памяти из-за типа данных?


РЕДАКТИРОВАТЬ:

Я нашел ошибку

Я пытаюсь этот код

printf("imgData_0[%d] : %f \n", n, (double)(imgData_0[n]));

Ошибка при преобразовании типа данных.

Значение кажется хорошим, но оно, похоже, является ошибкой в ​​значении из-за нарушения памяти.

SO ИзменитьINT до DOUBLE 4 байта остаются.

Как можно инициализировать значение, поместив 0 в эти 4 байта?

1 Ответ

1 голос
/ 07 ноября 2019

Проблема в этом коде, вероятно, заключается в следующем:

before_conv_x=(double*)imgData_0;
before_conv_y=(double*)imgData_1;
before_conv_z=(double*)imgData_2;

before_conv_ и imgData_ указывают на одну и ту же память, и на следующем шаге вы назначаете значение double этой памяти before_conv_[n]=imgData_[n]/4095.0;. Предыдущий код работает хорошо, потому что размеры int и float были одинаковыми. Теперь, чтобы исправить это, вы не должны использовать before_conv_=(double*)imgData_;, но вы должны создать новый double* before_conv_x= new double[n];

Редактировать:

double *before_conv_x = new double[`size`];
double *before_conv_y = new double[`size`];
double *before_conv_z = new double[`size`];

before_conv_x[n] = ((double)imgData_0[n])/4095.0;
before_conv_y[n] = ((double)imgData_1[n])/4095.0;
before_conv_z[n] = ((double)imgData_2[n])/4095.0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...