在CUDA C的一个项目中,我遇到了关于单精度和双精度浮点运算的意外行为.在项目中,我首先使用内核和另一个内核中的数字填充数组,然后对这些数字进行一些计算.所有变量和数组都是双精度的,所以我不希望任何单精度浮点运算发生.但是,如果我使用NVPROF分析程序的可执行文件,则表明执行了单精度操作.这怎么可能?
这是最小的程序,它在我的架构上显示了这种行为:(断言和错误捕获已被遗漏).我使用的是Nvidia Tesla k40显卡.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Nx 10
#define Ny 10
#define RANDOM double(0.236954587566)
__global__ void test(double *array, size_t pitch){
double rho, u;
int x = threadIdx.x + blockDim.x*blockIdx.x;
int y = threadIdx.y + blockDim.y*blockIdx.y;
int idx = y*(pitch/sizeof(double)) + 2*x;
if(x < Nx && y < Ny){
rho = array[idx];
u = array[idx+1]/rho;
array[idx] = rho*u;
}
}
__global__ void fill(double *array, size_t pitch){
int x = threadIdx.x + blockIdx.x * …Run Code Online (Sandbox Code Playgroud)