2010-07-10 35 views
6

是否有可能在列表,數組,某個設備函數中使用list/array的大小作爲參數在調用中或某個全局在通話時初始化的變量?在本地內存中使用CUDA定義可變大小陣列使用CUDA

我想是這樣,這些列表中的一個工作:

unsigned int size1; 

__device__ void function(int size2) { 

    int list1[size1]; 
    int list2[size2]; 
} 

是否有可能做一些聰明的做出這樣的工作?

回答

4

有分配共享內存的動態量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]; 
    // . . . 
} 

你必須考慮到會阻止。

+1

嗯..這是共享的東西。這是塊。我需要一個僅用於線程的列表,而不是一堆線程。我所做的只是使用預定義的大小。 – SenfMeister 2010-08-02 07:43:02

0

如果您知道可以預期的大小值,請考慮使用C++模板。 與boost預處理器一起,您可以輕鬆生成多個實例/入口點。

您可以做的其他事情是動態分配共享內存並手動分配指針。顯然,如果你需要超過共享內存

我可以爲您提供一個鏈接的線程專用內存,這可能無法正常工作,如果你想看到例如

+0

嗯..我有一棵樹,需要做一個搜索k近鄰。所以爲此,我需要一種方法來跟蹤我在樹中的位置......爲此我想到了一個尺寸爲treeheight的數組。 因爲我知道樹之前我做了處理kNN的核心調用之前,我有點知道大小。我無法看到模板如何幫助我在這裏..但我希望看到你的意思的例子... – SenfMeister 2010-07-10 23:02:44

-1

當然這是可能的!

以在項目的源代碼來看看: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); 
    } 
} 
+0

karlphillip:這不是一個指向全局分配內存的指針嗎? ,因爲我需要的是在每個內核中定義一個數組。你鏈接到每個內核並執行一個操作並在int i位置輸入列表。 – SenfMeister 2010-07-21 09:28:51