我试过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 编辑 ]