【发布时间】:2012-10-04 14:13:56
【问题描述】:
我想知道是否有一种有效的方法来划分数组的元素。我正在使用矩阵值 10000x10000 运行,与其他内核相比,它需要相当长的时间。除法是昂贵的操作,我不知道如何改进它。
__global__ void division(int N, float* A, int* B){
int row = blockIdx.x * blockDim.x + threadIdx.x;
int col = blockIdx.y * blockDim.y + threadIdx.y;
if((row < N) && (col <= row) ){
if( B[row*N+col] >0 )
A[row*N+col] /= (float)B[row*N+col];
}
}
内核启动
int N = 10000;
int threads = 32
int blocks = (N+threads-1)/threads
dim3 t(threads,threads);
dim3 b(blocks, blocks);
division<<< b, t >>>(N, A, B);
cudaThreadSynchronize();
选项 B:
__global__ void division(int N, float* A, int* B){
int k = blockIdx.x * blockDim.x + threadIdx.x;
int kmax = N*(N+1)/2
int i,j;
if(k< kmax){
row = (int)(sqrt(0.25+2.0*k)-0.5);
col = k - (row*(row+1))>>1;
if( B[row*N+col] >0 )
A[row*N+col] /= (float)B[row*N+col];
}
}
发布于
int threads =192;
int totalThreadsNeeded = (N*(N+1)/2;
int blocks = ( threads + (totalThreadsNeeded)-1 )/threads;
division<<<blocks, threads >>>(N, A, B);
为什么即使 threadId 是正确的,选项 B 也会给出错误的结果?这里缺少什么?
【问题讨论】:
-
那么在这个内核中,对于 1000x1000 的情况 N=1000?
-
@talonmies:是的,对不起。更新
-
您现在有 N=10000。那应该是 N=1000 吗?
-
不,其实是10000
-
所以您正在启动 1 亿 个线程,然后故意让其中一半只执行几次 IOP,您想知道为什么内核运行缓慢?我认为您在错误的地方寻找性能改进。慢除法不是你的问题......