$(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,所以我不知道如何修改它。
答案 0 :(得分:1)
正如Shadow所说,每个线程都分配了自己的threadIdx
,blockDim
,blockIdx
和gridDim
值。你无法修改它们。
对于您的示例,您可以使用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];
}