Я хочу изменить число с плавающей точкой на удвоение. Я попытался изменить тип данных с плавающей запятой на удвоение, но это было не то, что я ожидал, и вызвало ошибку.
Мой исходный код ЗДЕСЬ
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 байта?