从官网获得了一个例子,里面有编译.cu文件的命令,nvcc -m64 -ptx filename.cu -o filename.ptx发现在window 7下编译出来的和centos中编译出来的结果不一样,是不是在centos中不是用这个命令,要用其他的,有木有明白的道友来解惑的
刚刚对照了两个编译后的文件,发现是一样的,但是在java中执行结果却不一样
cuda代码:
extern “C”
global void add(int n, float *a, float *b, float *sum)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
//while(i < n) {
//sum[i] = a[0] + blockIdx.x * blockDim.x + threadIdx.x;//测试是否开启了这么多线程块和线程
//i = i + blockDim.x * gridDim.x;
//}
for(int j=0; j<1000; j++) {
sum[i][i][i][i] += a[i][i][i] + b[j];
}
}
java代码:
float test = new float[1000];
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
test[i][i][i] += a[i][i][i] + b[j];
}
}
这里cuda第一个结果和java一样,后面的每个数都比前一个数大1001[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
上面漏东西了
代码应该是下面的
浪里个浪 发表于 2016-12-29 14:27
刚刚对照了两个编译后的文件,发现是一样的,但是在java中执行结果却不一样 …
cuda代码:
extern “C”
global void add(int n, float *a, float *b, float *sum)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
//while(i < n) {
//sum = a[0] + blockIdx.x * blockDim.x + threadIdx.x;//测试是否开启了这么多线程块和线程
//i = i + blockDim.x * gridDim.x;
//}
for(int j=0; j<1000; j++) {
sum[i] += a[i] + b[j];
}
}
java代码:
float test = new float[1000];
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
test[i] += a[i] + b[j];
}
}
这里cuda第一个结果和java一样,后面的每个数都比前一个数大1001
论坛bug 上面代码中sum += a + b[i]应该为sum[i] += a[i] + b[i]
test += a + b[i] 应该为test[i] += a[i] + b[i]
问题已解决,但还是没有找到原因
在cuda代码中添加一句话就好
cuda代码:
extern “C”
global void add(int n, float *a, float *b, float *sum)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
//while(i < n) {
//sum = a[0] + blockIdx.x * blockDim.x + threadIdx.x;//测试是否开启了这么多线程块和线程
//i = i + blockDim.x * gridDim.x;
//}
sum[i] = 0;
for(int j=0; j<1000; j++) {
sum[i] += a[i] + b[j];
}
}
这样的代码出的结果就是我想要的结果了,之前不对是因为没有释放内存吗,还是因为其他玩意?
在一般情况下,java语言对基本数据类型有默认值,float数组在初始化后会被赋为初始值,而C语言不进行这种默认操作,其值实际上为这块内存区域原始的值。
PS 数组符号是不是显示不出来?可以使用代码插入功能
a[1]+a[2]
是的,我后来经过别人讲解才知道C中关于这个变量的问题,数组符号有时候就是不好显示
回帖时点击"代码"按钮,然后把源程序复制进去,这样代码就能显示全啦,看起来也更方便