菜鸟求助 相关问题2则

谢谢各位大侠给意见:
第一、是否存在这样一种情况,对于同一块显卡、不同的cuda版本需要不同的驱动程序。(提出这个问题的原因是因为 我的程序在cuda1.1中跑的是正常的 在cuda2.3中确是失败的 并且部分程序没有在gpu上执行)
如果是,我在cuda1.1中也没有安装任何针对的cuda的驱动 为何能执行成功呢。
第二、我试过2个算法、性能上差异很大。有大侠说是线程读取的方式问题。不过貌似这个理由不是很正确
第一个算法,每个线程都是连续存取内存位置,相当于thread 0 读取第一个数字,thread 1 读取第tid * size个数字
global static void sumOfSquares_Thread(int num, int result, clock_t* time)
{
const int tid = threadIdx.x;
const int size = DATA_SIZE / THREAD_NUM;

int sum = 0;
int i;

clock_t start;
if(tid == 0) start = clock();

for(i = tid * size; i < (tid + 1) * size; i++) {
sum += num[i] + num[i] + num[i] + num[i] + num[i] + num[i]+ num[i] + num[i] + num[i] + num[i] + num[i] + num[i];
}

result[tid] = sum;
if(tid == 0) time = clock() - start;
}
第二个算法, thread 0 读取第一个数字,thread 1 读取第二个数字
global static void sumOfSquares_ThreadOptimization(int num, int result, clock_t
time)
{
const int tid = threadIdx.x;
int sum = 0;
int i;
clock_t start;
if(tid == 0) start = clock();
for(i = tid; i < DATA_SIZE; i += THREAD_NUM) {
sum += num[i] + num[i] + num[i] + num[i] + num[i] + num[i]+ num[i] + num[i] + num[i] + num[i] + num[i] + num[i];
}

result[tid] = sum;
if(tid == 0) *time = clock() - start;
}
其实这两个算法的差异仅仅是在 不同的线程读取的位置不一样 一个是连续的 一个是跳跃的。不应该说一个是连续读取(thread0读取时 thread1等待),一个是并行读取
但是这2个算法得出的性能结果差异确实很大,希望大侠能够给出大家各自的想法

一、这不可能
二、大侠说的没错

你的程序的问题应当是:你加的num是指针,出错当然了?

是sum += num[0]+num[0]… 复制的时候可能由于UBB没显示出来
程序是没问题的 所以第一个问题的现象 其实还是处于无解中…

第二个问题大侠说的读取方式是没错的 但是为什么这样的读取方式会产生性能差异
为什么线程1连续读取 会让线程2等待 线程1和线程2根本没有用到同一块资源

用插入代码