CUDA编程修改blockIdx.x索引

时间:2017-05-18 02:44:48

标签: arrays cuda

$(document).ready(function () {
	'use strict';
	// SITE MENU
	// This line of code adds the period to end of link
	document.getElementById("nav-item").innerHTML += ".";
	// These lines of code move the active class when a link is clicked
	$(function () {
		var current_page_URL = location.href;
		$("a").each(function () {
			if ($(this).attr("href") !== "#") {
				var target_URL = $(this).prop("href");
				if (target_URL == current_page_URL) {
					$('.nav a').parents('li, ul').removeClass('active');
					$(this).parent('li').addClass('active');
					return false;
				}
			}
		});
	});
});

上面的代码是2个向量的基本总和。但我想修改正在添加的数组的索引。 例如, 如果我有我的第一个数组A = [1,2,3,4,5,6]和B = [10,20,30,40,50,60]。 我想使用A和B的元素得到数组C = [1 + 60,2 + 50,3 + 40,4 + 30,5 + 20,6 + 10]。 看来,blockIdx.x会自动增加1,所以我不知道如何修改它。

1 个答案:

答案 0 :(得分:1)

正如Shadow所说,每个线程都分配了自己的threadIdxblockDimblockIdxgridDim值。你无法修改它们。

对于您的示例,您可以使用gridDim.x来获取此类的块数。 (full code

__global__ void add(const int *a, const int *b, int *c)
{
    int tid = blockIdx.x;
    c[tid] = a[tid] + b[(gridDim.x - 1)- tid];
}

为确保tid保持在数组边界,您可以将数组元素的数量作为参数传递。

__global__ void add(const int *a, const int *b, int *c, const int N)
{
    int tid = blockIdx.x;
    if (tid < N)
        c[tid] = a[tid] + b[(gridDim.x - 1)- tid];
}

如果您像add<<<6, 1>>>(a, b, c, 6)一样启动此内核,则if (tid < N)是多余的,因为您无论如何都只启动了6个块。但是在一般情况下,你将启动多个块,其中每个块都有多个线程,并且最后一个块中可能有一些填充线程。

unsigned int N = 1000; // total number of elements
dim3 blkDim{ 32 };
dim3 grdDim{ (N + 32 - 1) / 32 };
add<<<grdDim, blkDim>>>(a, b, c, N);

在这种情况下,您必须检查数组索引的边界条件。

__global__ void add(const int *a, const int *b, int *c, const int N)
{
    int tid = blockIdx.x * blockDim.x + threadIdx.x;
    if (tid < N)
        c[tid] = a[tid] + b[(N - 1)- tid];
}