簡體   English   中英

了解CUDA設備代碼中memset的用法

[英]Understanding the use of memset in CUDA device code

我有一個線性int數組arr ,它位於CUDA全局內存上。 我想將arr子數組設置為已定義的值。 子數組的起始索引由starts數組給定,而每個子數組的長度以counts數組給定。

我想做的是設置子數組i的值,從starts[i] ,一直到counts[i]到值starts[i] 即,操作為:

arr[starts[i]: starts[i]+counts[i]] = starts[i]

我想到了在內核中使用memset()來設置值。 但是,它沒有被正確地寫入(為數組元素分配了一些隨機值)。 我使用的代碼是:

#include <stdlib.h>
__global__ void kern(int* starts,int* counts, int* arr,int* numels)
{
    unsigned int idx = threadIdx.x + blockIdx.x*blockDim.x;

    if (idx>=numels[0])
        return;

    const int val = starts[idx];
    memset(&arr[val], val, sizeof(arr[0])*counts[idx]) ;
    __syncthreads();
}

請注意, numels[0]包含starts數組中的元素數。

我已經使用cuda-memcheck()檢查了代碼,但沒有收到任何錯誤。 如果相關,我正在使用PyCUDA 在學習CUDA時,我可能誤解了memset的用法。

您能否提出一種糾正此問題的方法? 或其他有效的方法來執行此操作。

PS:我知道thrust::fill()可能可以做到這一點,但是由於我正在學習CUDA,所以我想知道如何在不使用外部庫的情況下做到這一點。

CUDA設備代碼中的memset和memcpy實現發出簡單的,串行的,字節值的操作(請注意,memset除了字節值之外不能設置其他任何內容,這可能會導致您看到要設置的值是否是大於8位)。

您可以將memset調用替換為以下內容:

const int val = starts[idx];
//memset(&arr[val], val, sizeof(arr[0])*counts[idx]) ;
for(int i = 0; i < counts[idx]; i++)
    arr[val + i] = val;

該代碼的性能可能會比內置內存集更好。

還要注意,在內核末尾的__syncthreads()調用既不必要,又是潛在的死鎖源,應將其刪除。 有關更多信息,請參見此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM