关于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];
}

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];
}

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

[ 本帖最后由 jnrain3736 于 2010-5-5 16:34 编辑 ]

第二个远比第一个快

另:你的计时方式不太好,但是也没什么大问题

嗯 我比较想知道为什么比第一个快 – --!

呵呵!查看一下合并访问