用户
 找回密码
 立即注册
浪里个浪 该用户已被删除
发表于 2016-12-29 14:22:58
64488
从官网获得了一个例子,里面有编译.cu文件的命令,nvcc -m64 -ptx filename.cu -o filename.ptx发现在window 7下编译出来的和centos中编译出来的结果不一样,是不是在centos中不是用这个命令,要用其他的,有木有明白的道友来解惑的
使用道具 举报 回复
发表于 2016-12-29 14:27:32
刚刚对照了两个编译后的文件,发现是一样的,但是在java中执行结果却不一样
使用道具 举报 回复 支持 反对
发表于 2016-12-29 15:46:01
本帖最后由 浪里个浪 于 2016-12-29 15:48 编辑
浪里个浪 发表于 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 += a + b[j];
        }


}




java代码:
float[] test = new float[1000];
        for (int i = 0; i < 1000; i++) {
                        for (int j = 0; j < 1000; j++) {
                                test += a + b[j];
                        }
                }

这里cuda第一个结果和java一样,后面的每个数都比前一个数大1001
使用道具 举报 回复 支持 反对
发表于 2016-12-29 15:48:40
浪里个浪 发表于 2016-12-29 15:46
cuda代码:
extern "C"
__global__ void add(int n, float *a, float *b, float *sum)

上面漏东西了

代码应该是下面的


浪里个浪 发表于 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 += a + b[j];
        }


}




java代码:
float[] test = new float[1000];
        for (int i = 0; i < 1000; i++) {
                        for (int j = 0; j < 1000; j++) {
                                test += a + b[j];
                        }
                }

这里cuda第一个结果和java一样,后面的每个数都比前一个数大1001
使用道具 举报 回复 支持 反对
发表于 2016-12-29 15:50:21
浪里个浪 发表于 2016-12-29 15:48
上面漏东西了

代码应该是下面的

论坛bug 上面代码中sum += a + b应该为sum += a + b
test += a + b 应该为test += a + b
使用道具 举报 回复 支持 反对
发表于 2016-12-29 16:26:34
问题已解决,但还是没有找到原因
在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];
        }


}
这样的代码出的结果就是我想要的结果了,之前不对是因为没有释放内存吗,还是因为其他玩意?
使用道具 举报 回复 支持 反对
发表于 2016-12-29 17:47:56
在一般情况下,java语言对基本数据类型有默认值,float数组在初始化后会被赋为初始值,而C语言不进行这种默认操作,其值实际上为这块内存区域原始的值。

PS 数组符号是不是显示不出来?可以使用代码插入功能
  1. a[1]+a[2]
复制代码

使用道具 举报 回复 支持 反对
发表于 2016-12-29 18:21:27
louis 发表于 2016-12-29 17:47
在一般情况下,java语言对基本数据类型有默认值,float数组在初始化后会被赋为初始值,而C语言不进行这种默 ...

是的,我后来经过别人讲解才知道C中关于这个变量的问题,数组符号有时候就是不好显示
使用道具 举报 回复 支持 反对
发表于 2016-12-29 19:04:45
浪里个浪 发表于 2016-12-29 18:21
是的,我后来经过别人讲解才知道C中关于这个变量的问题,数组符号有时候就是不好显示 ...

回帖时点击"代码"按钮,然后把源程序复制进去,这样代码就能显示全啦,看起来也更方便
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册