是否有可能在列表,數組,某個設備函數中使用list/array的大小作爲參數在調用中或某個全局在通話時初始化的變量?在本地內存中使用CUDA定義可變大小陣列使用CUDA
我想是這樣,這些列表中的一個工作:
unsigned int size1;
__device__ void function(int size2) {
int list1[size1];
int list2[size2];
}
是否有可能做一些聰明的做出這樣的工作?
是否有可能在列表,數組,某個設備函數中使用list/array的大小作爲參數在調用中或某個全局在通話時初始化的變量?在本地內存中使用CUDA定義可變大小陣列使用CUDA
我想是這樣,這些列表中的一個工作:
unsigned int size1;
__device__ void function(int size2) {
int list1[size1];
int list2[size2];
}
是否有可能做一些聰明的做出這樣的工作?
有分配共享內存的動態量1路 - 使用第三個啓動內核參數:
__global__ void kernel (int * arr)
{
extern __shared__ int buf []; // size is not stated
// copy data to shared mem:
buf[threadIdx.x] = arr[blockIdx.x * blockDim.x + threadIdx.x];
// . . .
}
// . . .
// launch kernel, set size of shared mem in bytes (k elements in buf):
kernel<<<grid, threads, k * sizeof(int)>>> (arr);
有許多陣列黑客攻擊:分配給內存:
__device__ void function(int * a, int * b, int k) // k elements in first list
{
extern __shared__ int list1 [];
extern __shared__ int list2 []; // list2 points to the same point as list1 does
list1 [threadIdx.x] = a[blockIdx.x * blockDim.x + threadIdx.x];
list2 [k + threadIdx.x] = b[blockIdx.x * blockDim.x + threadIdx.x];
// . . .
}
你必須考慮到會阻止。
如果您知道可以預期的大小值,請考慮使用C++模板。 與boost預處理器一起,您可以輕鬆生成多個實例/入口點。
您可以做的其他事情是動態分配共享內存並手動分配指針。顯然,如果你需要超過共享內存
我可以爲您提供一個鏈接的線程專用內存,這可能無法正常工作,如果你想看到例如
嗯..我有一棵樹,需要做一個搜索k近鄰。所以爲此,我需要一種方法來跟蹤我在樹中的位置......爲此我想到了一個尺寸爲treeheight的數組。 因爲我知道樹之前我做了處理kNN的核心調用之前,我有點知道大小。我無法看到模板如何幫助我在這裏..但我希望看到你的意思的例子... – SenfMeister 2010-07-10 23:02:44
當然這是可能的!
以在項目的源代碼來看看:http://code.google.com/p/cuda-grayscale/
此功能從主叫(),並基於其上gpu_image灰度轉換的寬度和高度: cuda_grayscale(gpu_image,寬度,高度,網格,塊);
如果你挖一點點,你會發現在kernel_gpu.cu實現:
__global__ void grayscale(float4* imagem, int width, int height)
{
const int i = blockIdx.x * (blockDim.x * blockDim.y) + blockDim.x * threadIdx.y + threadIdx.x;
if (i < width * height)
{
float v = 0.3 * imagem[i].x + 0.6 * imagem[i].y + 0.1 * imagem[i].z;
imagem[i] = make_float4(v, v, v, 0);
}
}
karlphillip:這不是一個指向全局分配內存的指針嗎? ,因爲我需要的是在每個內核中定義一個數組。你鏈接到每個內核並執行一個操作並在int i位置輸入列表。 – SenfMeister 2010-07-21 09:28:51
嗯..這是共享的東西。這是塊。我需要一個僅用於線程的列表,而不是一堆線程。我所做的只是使用預定義的大小。 – SenfMeister 2010-08-02 07:43:02