gpt4 book ai didi

下三角矩阵上的 CUDA 循环

转载 作者:行者123 更新时间:2023-12-01 14:41:44 25 4
gpt4 key购买 nike

如果有一个矩阵,我只想访问矩阵的下三角部分。我试图找到一个好的线程索引,但到目前为止我还没有管理它。有任何想法吗?
我需要和索引来循环下三角矩阵,说这是我的矩阵

1 2 3 4
5 6 7 8
9 0 1 2
3 5 6 7

该指数应该去
1 
5 6
9 0 1
3 5 6 7

在本例中,一维数组的位置为 0、4、5、8、9、10、12、13、14、15。

CPU循环是:
for(i = 0; i < N; i++){
for(j = 0; j <= i; j++){
.......

其中 N 是行数。我在内核中尝试一些东西:
 __global__ void Kernel(int N) {

int row = blockIdx.x * blockDim.x + threadIdx.x;
int col = blockIdx.y * blockDim.y + threadIdx.y;
if((row < N) && (col<=row) )
printf("%d\n", row+col);
}

然后这样称呼它:
 dim3 Blocks(1,1);
dim3 Threads(N,N);
Kernel<<< Blocks, Threads>>>(N);

但它根本不起作用。
我得到的:
0
1
2
2
3
4

最佳答案

您正在启动一个线程网格,然后禁用对角线上的所有线程,即约 50% 的线程将不执行任何操作,这是非常低效的。

代码的简单修复是修复索引:

__global__ void Kernel(int N)
{
int row = blockIdx.x * blockDim.x + threadIdx.x;
int col = blockIdx.y * blockDim.y + threadIdx.y;
if((row < N) && (col<=row) )
printf("%d\n", row * N + col);
}

也许更有效但更复杂的解决方案是启动正确数量的线程并转换索引。退房 this answer对于起点...

关于下三角矩阵上的 CUDA 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12367685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com