Hello,
I just want to initialize array at declaration TYPE a={1.0,2.0} and it seems to be a problem when TYPE=double.
Just post my sample code below :
[codebox]#include
#include “cuPrintf.cu”
typedef double TYPE;
using namespace std;
global void test_init_array(TYPE *nodes) {
TYPE x11,x21,x31,x12,x22,x32;
x11=nodes[0];
x21=nodes[1];
x31=nodes[2];
x12=nodes[3];
x22=nodes[4];
x32=nodes[5];
// if xi declared like that then the compute is ok in float or double.
/* TYPE x11=0.0;
TYPE x21=0.5;
TYPE x31=0.25;
TYPE x12=0.0;
TYPE x22=0.0;
TYPE x32=0.25;*/
TYPE S=0.5abs((x21-x11)(x32-x12)-(x31-x11)*(x22-x12));
TYPE Be={(x22-x32)/(2S),0,(x32-x12)/(2S),0,(x12-x22)/(2*S),0,
0,(x31-x21)/(2*S),0,(x11-x31)/(2*S),0,(x21-x11)/(2*S),
(x31-x21)/(2*S),(x22-x32)/(2*S),(x11-x31)/(2*S), (x32-x12)/(2*S),(x21-x11)/(2*S),(x12-x22)/(2*S)};
cuPrintf("compute : ");
for (unsigned i=0;i<18;i++) cuPrintf(“%0.0f “, Be[i]); cuPrintf(”\n”);
cuPrintf(“solution : -2 0 2 0 0 0 0 -2 0 -2 0 4 -2 -2 -2 2 4 0\n”);
}
int main() {
cudaPrintfInit();
TYPE nodes={0.0,0.5,0.25,0,0,0.25};
TYPE *nodes_d;
cudaError_t error = cudaMalloc((void**)&nodes_d,sizeof(nodes)); if (error != cudaSuccess) cout << cudaGetErrorString( error) << endl;
error = cudaMemcpy(nodes_d,nodes,sizeof(nodes),cudaMemcpyHostToDevic
e);if (error != cudaSuccess) cout << cudaGetErrorString( error) << endl;
test_init_array<<<1,1>>>(nodes_d);
error = cudaGetLastError(); if (error != cudaSuccess) cout << cudaGetErrorString( error) << endl;
cudaPrintfDisplay(stdout, false);
cudaPrintfEnd();
}
[/codebox]
With float type, the result in Be is OK but in double, the result is false…
Is it normal ? Is it a bug ? What s wrong in my syntax ?
I compiled with “/usr/local/cuda/bin/nvcc -arch=sm_13 test_init_array.cu -o test_init_array” command.
Nvcc is Cuda compilation tools, release 2.3, V0.2.1221
EDIT : Nvcc 3.0, V0.2.1221 same problem…
Work on T1060, linux debian 64, four quad xeon…
Alain