我想運行一個cuda程序,但我是初學者。我必須編寫一個直方圖的程序。 但與桶。根據maxValue(示例中的40),該數字將被添加到相應的存儲桶中。如果我們有4個桶:Cuda編程直方圖
histo:| | 1 | 10 | 30 | 39 | 32 | 2 | 4 | 5 | 1 |
0-9(第一桶)
10-19(第二桶)
20-29(第三鬥)
30- 39(第四鬥)
我的GPU有計算能力1.1。
我試圖這樣做具有共享臨時[]對於每個線程上添加他的臨時表中他的值的塊:
__global__ void histo_kernel_optimized5(unsigned char *buffer, long size,
unsigned int *histo)
{
extern __shared__ unsigned int temp[];
temp[threadIdx.x] = 0;
__syncthreads();
int i = threadIdx.x + blockIdx.x * blockDim.x;
int offset = blockDim.x * gridDim.x;
int bucketID;
while (i < size)
{
bucketID = array[i]/Bwidth;
atomicAdd(&temp[bucketID], 1);
i += offset;
}
__syncthreads();
atomicAdd(&(histo[threadIdx.x]), temp[threadIdx.x]);
}
histo_kernel_optimized <<<array_size/buckets, buckets,buckets*sizeof(unsigned int)>>>(buffer,SIZE, histogram)
但是,編譯器的SAI: 指令「{原子,紅色}。共享'需要。 目標sm_12或更高
我也嘗試已經爲每個線程臨時表創建:
__global__ void histo_kernel_optimized5(unsigned char *buffer, long size,
unsigned int *histo)
{
unsigned int temp[buckets];
int j;
for (j=0;j<buckets;j++){
temp[j]=0;
}
int bucketID;
int i = threadIdx.x + blockIdx.x * blockDim.x;
int offset = blockDim.x * gridDim.x;
while (i < size)
{
bucketID = array[i]/Bwidth;
temp[bucketID]++;
i += offset;
}
for (j=0;j<buckets;j++){
histo[j] += temp[j];
}
}
但因爲它需要一個不斷到創建臨時編譯器不要讓我做表。但問題是存儲區是動態的給出的命令行。
有沒有另一種方法呢?我不知道該怎麼做。我很困惑。
爲什麼要將一個塊大小添加到大小:grid((size + block.x - 1)/block.x); –
因此,線程的總數是** atleast **等於'size'。此公式將線程總數加總爲大於或等於'size'的塊大小的倍數。選擇'size'的值並計算自己看到的線程總數。 – sgarizvi
是的,你是對的!但是我沒有得到相同的結果,平行直方圖[]和串行直方圖[]是不同的!我不知道爲什麼,我用你的代碼,因爲它! –