2015-06-14 112 views
1

爲了優化一個內核,我需要用一個偏移量來創建一個cl_mem對象的副本。ClEnqueueCopyBuffer與偏移量1

count_buffer3[n] = count_buffer[n+1] 

是所期望的結果

綜觀ClEnqueueCopyBuffer的說明書它似乎是能夠以簡單的論點。

cl_int clEnqueueCopyBuffer ( cl_command_queue command_queue, 
    cl_mem src_buffer, 
    cl_mem dst_buffer, 
    size_t src_offset, 
    size_t dst_offset, 
    size_t cb, 
    cl_uint num_events_in_wait_list, 
    const cl_event *event_wait_list, 
    cl_event *event) 

我的想法是DST_OFFSET設置爲1,所以copy_buffer [0]進入copy_buffer [1] 在我的情況下,命令如下:

clEnqueueCopyBuffer(command_queue, count_buffer, count_buffer3, 1, 0, (inCount1 + 1) * sizeof(int), NULL, NULL, NULL); 

所以我想count_buffer複製1. 結果count_buffer3具有偏移應該是這樣的:

count_buffer[1] = 2 
count_buffer[2] = 12 
count_buffer[3] = 26 

count_buffer3[1] = 12 
count_buffer3[2] = 26 

不幸的是,如果我的DST_OFFSET是1等所示實施例我的完整湊nt_buffer3對象只包含「0」作爲int值。

如果我的偏移量爲0,複製工作正常,並且兩個count_buffers是相同的。

附加信息: 這裏有clmem對象的初始化:

cl_mem count_buffer3 = clCreateBuffer(context, CL_MEM_READ_WRITE, (inCount1 + 1) * sizeof(int), NULL, &err); errWrapper("create Buffer", err); 

cl_mem count_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, (inCount1+1) * sizeof(int), NULL, &err); errWrapper("create Buffer", err); 

我使用英特爾INDE更新2與Visual Studio 2013

我在這裏做某事錯了,還是應該複製像這樣的抵消工作?

編輯: 我減少了一個緩衝區大小和結果的變化。 而不是所有的「0」我得到一些非常大的數字。從調試

例如:

count_buffer[0] = 0 
count_buffer[1] = 31 
count_buffer[2] = 31 

count_buffer3[0] = 520093696 
count_buffer3[1] = 520093696 
count_buffer3[2] = 520093696 

這是一個進步 「0」 值,但仍然是錯誤的。 有什麼想法?

感謝您的回答!

+1

對於好奇心起見,'520093696 = 31 << 24;'女巫是完全等同於讀8位出在一個32位的int數組偏移。 – DarkZeros

回答

1

的偏移量是以字節爲單位。你可能想的sizeof count_buffer[0]一個偏移量和大小的(n - 1) * sizeof count_buffer[0]

clEnqueueCopyBuffer(
    command_queue, count_buffer, count_buffer3, 
    sizeof(cl_int), 0, 
    inCount1 * sizeof(cl_int), 
    NULL, NULL, NULL); 
+0

中添加詳細信息現在可以使用!非常感謝!我沒有考慮抵消的大小。我應該更精確地閱讀文檔。 –

+0

@KäptnFreiversuch只是FWIW,沒有地方可以指定單個元素的大小,因此無論文檔如何,函數都不可能像您期望的那樣運行:) –

1

很有可能clEnqueueCopyBuffer會返回一個您不檢查的錯誤。根據manual:如果src_offset,DST_OFFSET,CB,src_offset + CB,或DST_OFFSET + CB所需要的緩衝存儲器的對象外訪問元素

CL_INVALID_VALUE被返回。

這似乎是你的情況。 你可能想通過大小比你的緩衝區的大小複製一個都不能少:

clEnqueueCopyBuffer(command_queue, count_buffer, count_buffer3, 1, 0, inCount1 * sizeof(int), NULL, NULL, NULL); 
                     ^^^^^^^^ 
+0

你對Buffersize是正確的。我減少了一個。我會在問題 –