これらの剰余演算を避けるために、より良いグリッドレイアウトを使用する:あなたは別の番号を追加したい場合は、あなたのような何かができる
__global__ void MyAddingKernel(int* matrix, int M, int N)
{
int gid = threadIdx.x + blockDim.x*blockIdx.x;
//Let's add the row number to each element
matrix[ gid ] += gid % M;
//Let's add the column number to each element
matrix[ gid ] += gid % N;
}
:何あなたができることのようなものです。
最新のCudaで64ビット範囲の行に一意のブロック索引を使用します。
スレッドがすべての要素をループして反復し、ユニークなスレッドインデックスを追加します。
計算されたデータがブロック(行)全体にわたって一意である場合、特に複雑な計算の場合、入力データのタイル化は一般的なアプローチです。
/*
* @param tileCount
*/
__global__ void addRowNumberToCells(int* inOutMat_g,
const unsigned long long int inColumnCount_s,
const int inTileCount_s)
{
//get unique block index
const unsigned long long int blockId = blockIdx.x //1D
+ blockIdx.y * gridDim.x //2D
+ gridDim.x * gridDim.y * blockIdx.z; //3D
/*
* check column ranges in case kernel is called
* with more blocks then columns
* (since its block wide following syncthreads are safe)
*/
if(blockId >= inColumnCount_s)
return;
//get unique thread index
const unsigned long long int threadId = blockId * blockDim.x + threadIdx.x;
/*
* calculate unique and 1 blockId
* maybe shared memory is overhead
* but it shows concept if calculation is more complex
*/
__shared__ unsigned long long int blockIdAnd1_s;
if(threadIdx.x == 0)
blockIdAnd1_s = blockId + 1;
__sycnthreads();
unsigned long long int idx;
//loop over tiles
for(int i = 0; i < inTileCount_s)
{
//calculate new offset for sequence thread writes
idx = i * blockDim.x + threadIdx.x;
//check new index range in case column count is no multiple of blockDim.x
if(idx >= inColumnCount_s)
break;
inOutMat_g[idx] = blockIdAnd1_s;
}
}
例クーダ2.0:
マット[131000] [1000]
必要blockCount blockDim.y用65535分の131000 = 2切り上げ=!
inTileCount_s = 1000/192 = 6切り上げ!
(クーダ2.0に= 100占有ブロック当たり192スレッド)
< <(65535、2、1)、(192、1、1)>> addRowNumberToCells(マット、1000 6)
返信ありがとう、ありがとうございます。しかし、追加する代わりに各行の各要素を右から左に移動したいのですが?したがって、私の例では、最初の行(1,2,3)は(2 3 3)[最後の要素を同じに保ちます]、(4 5 6)は(5 6 6)になり、(7 8 9)は9 9)?あなたが示した追加操作のようなことは可能でしょうか?ありがとう! – overloading
この場合、 'matrix [gid] =(gid%N)?行列[gid + 1]:行列[gid]; ' 可能性があります。 – limes
モジュロ演算子は、gpuで高価な操作です、それを避けてみてください! – djmj