我目前使用下面的還原功能使用CUDA來概括所有元素的數組中的多個陣列:CUDA還原
__global__ void reduceSum(int *input, int *input2, int *input3, int *outdata, int size){
extern __shared__ int sdata[];
unsigned int tID = threadIdx.x;
unsigned int i = tID + blockIdx.x * (blockDim.x * 2);
sdata[tID] = input[i] + input[i + blockDim.x];
__syncthreads();
for (unsigned int stride = blockDim.x/2; stride > 32; stride >>= 1)
{
if (tID < stride)
{
sdata[tID] += sdata[tID + stride];
}
__syncthreads();
}
if (tID < 32){ warpReduce(sdata, tID); }
if (tID == 0)
{
outdata[blockIdx.x] = sdata[0];
}
}
然而,正如你可以從函數的參數看,我會喜歡能夠在一個簡化函數內求和三個單獨的數組。現在很明顯,一個簡單的方法是啓動內核三次,每次傳遞一個不同的數組,這當然會起作用。我只是把它作爲一個測試內核來寫,但真正的內核最終會得到一個結構數組,而且我需要爲每個結構的所有X,Y和Z值執行一個加法,這就是爲什麼我需要在一個內核中總結它們。
我已經initalised併爲所有三個陣列
int test[1000];
std::fill_n(test, 1000, 1);
int *d_test;
int test2[1000];
std::fill_n(test2, 1000, 2);
int *d_test2;
int test3[1000];
std::fill_n(test3, 1000, 3);
int *d_test3;
cudaMalloc((void**)&d_test, 1000 * sizeof(int));
cudaMalloc((void**)&d_test2, 1000 * sizeof(int));
cudaMalloc((void**)&d_test3, 1000 * sizeof(int));
我不確定什麼網格和塊尺寸,我應該使用這種內核的,我不完全知道如何修改減少迴路分配的內存將數據放置,因爲我想它,即 輸出數組:
Block 1 Result|Block 2 Result|Block 3 Result|Block 4 Result|Block 5 Result|Block 6 Result|
Test Array 1 Sums Test Array 2 Sums Test Array 3 Sums
我希望是有道理的。還是有更好的方法只有一個約簡函數,但能夠返回Struct.X,Struct.Y或struct.Z的總和?
這裏的結構:
template <typename T>
struct planet {
T x, y, z;
T vx, vy, vz;
T mass;
};
我需要添加了所有的VX和存儲,所有的VY並儲存起來,所有的VZ和存儲。
爲什麼不提供一個你想總結的結構數組的實際定義?它只是:'struct my_struct {int x,y,z;} data [1000];'?這很重要的原因是因爲這樣的減少操作將受到內存帶寬的限制。因此,內存中的數據組織以及訪問模式對於理解實現最高性能至關重要。一個好的解決方案將優化內存訪問模式以優化可用內存帶寬的使用。 –
對不起,你是對的,我已經用struct的定義更新了主帖。 –