2013-03-15 75 views
2

我是想通過這種方式來複制到常量內存的結構:cudaMemcpyToSymbol使用或不使用字符串

struct Foo { 
    int a, b, c; 
}; 

__constant__ Foo cData; 

int main() { 
    Foo hData = {1, 2, 3}; 
    cudaMemcpyToSymbol(cData, &hData, sizeof(Foo)); 
    // ... 
} 

這工作得很好,在我的內核,我可以直接訪問常量數據:

__global__ void kernel() { 
    printf("Data is: %d %d %d\n", cData.a, cData.b, cData.c); // 1 2 3 
} 

但後來我試圖用const char *作爲符號的名字,事情停止工作:

cudaMemcpyToSymbol("cData", &hData, sizeof(Foo)); // prints 0 0 0 

我以爲兩個版本都是相似的,但似乎我錯了。

發生了什麼事?

編輯: 我要報告與cudaGetSymbolAddress,這工作對我來說這同樣的行爲,如果沒有const char *使用:

__constant__ int someData[10]; 
__constant__ int *ptrToData; 

int *dataPosition; 
cudaGetSymbolAddress((void **)&dataPosition, someData); // Works 
// cudaGetSymbolAddress((void **)&dataPosition, "someData"); // Do not work 
cudaMemcpyToSymbol(ptrToData, &dataPosition, sizeof(int *)); 

回答

8

隨着CUDA 5,使用字符串作爲符號名不再支持的。這是包括在CUDA 5發佈說明here

•使用字符串來指示設備符號,它是可能的某些API函數,不再支持。相反,該符號應該直接使用。

其中的一個原因這與實現一個真正的設備接頭,其是在CUDA新功能做5

+0

Ooooh,我錯過了!謝謝! :) – AkiRoss 2013-03-15 15:52:45

2

因爲一次又一次得到同樣的錯誤,我想分享這示例代碼,顯示了幾乎所有這個問題的例子(所以我可能會在稍後再次犯同樣的錯誤時再提到)。

//file: main.cu 
#include <stdio.h> 
#include <stdlib.h> 
#include <cuda.h> 

__constant__ float constData[256]; 
__device__ float devData; 
__device__ float* devPointer; 

int main(int argc, char **argv) 
{ 
    cudaFree(0); 

    float data[256]; 
    cudaError_t err = cudaMemcpyToSymbol(constData, data, sizeof(data)); 
    printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err)); 

    float value = 3.14f; 
    err = cudaMemcpyToSymbol(devData, &value, sizeof(float)); 
    printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err)); 

    float* ptr; 
    cudaMalloc(&ptr, 256 * sizeof(float)); 
    err = cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr)); 
    printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err)); 
    cudaFree(ptr); 

    return EXIT_SUCCESS; 
} 

我得到 「無效的設備符號」 和許多其他這是有關_ 不斷 _ _ 設備 _內存使用情況。此代碼在運行時不會出現此類錯誤。

相關問題