ran*_*pal 14 c cuda gpu-constant-memory
问题
我使用常量内存准备了一个示例CUDA代码.我可以在cuda 4.2中成功运行它,但是当我使用CUDA 5编译时,我得到 "无效的设备符号".我在这里附加了示例代码.
代码
#include <iostream>
#include <stdio.h>
#include <cuda_runtime.h>
#include <cuda.h>
struct CParameter
{
    int A;  
    float B;
    float C;
    float D;
};
__constant__ CParameter * CONSTANT_PARAMETER;   
#define PARAMETER "CONSTANT_PARAMETER"
bool ERROR_CHECK(cudaError_t Status)
{
    if(Status != cudaSuccess)
    {
        printf(cudaGetErrorString(Status));
        return false;
    }   
    return true;
}
// Kernel that executes on the CUDA device
__global__ void square_array(float *a, int N)
{
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
  if (idx<N)
  {
      a[idx] = CONSTANT_PARAMETER->A * a[idx];
  }
}
////Main Function/////
int main(void)
{
    /////Variable Definition
    const int N = 10;
    size_t size = N * sizeof(float);
    cudaError_t Status = cudaSuccess;
    CParameter * m_dParameter;
    CParameter * m_hParameter;
    float * m_D;
    float * m_H;
    //Memory Allocation Host
    m_hParameter = new CParameter;
    m_H = new float[N];
    //Memory Allocation Device
    cudaMalloc((void **) &m_D, size);
    cudaMalloc((void**)&m_dParameter,sizeof(CParameter));
    ////Data Initialization
    for (int i=0; i<N; i++) 
        m_H[i] = (float)i;
    m_hParameter->A = 5;
    m_hParameter->B = 3;
    m_hParameter->C = 98;
    m_hParameter->D = 100;
    //Memory Copy from Host To Device
    Status = cudaMemcpy(m_D, m_H, size, cudaMemcpyHostToDevice);
    ERROR_CHECK(Status);
    Status = cudaMemcpy(m_dParameter,m_hParameter,sizeof(CParameter),cudaMemcpyHostToDevice);
    ERROR_CHECK(Status);        
    Status = cudaMemcpyToSymbol(PARAMETER, &m_dParameter, sizeof(m_dParameter));
    ERROR_CHECK(Status);
    // Do calculation on device:
    int block_size = 4;
    int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
    square_array <<<n_blocks, block_size>>>(m_D,N);
    // Retrieve result from device and store it in host array
    cudaMemcpy(m_H, m_D, sizeof(float)*N, cudaMemcpyDeviceToHost);
    // Print results
    for (int i=0; i<N; i++)
        printf("%d %f\n", i, m_H[i]);
    // Cleanup
    free(m_H);
    free(m_hParameter);
    cudaFree(m_dParameter);
    cudaFree(m_D);
    return 0;   
}
我试过WINDOWS:CUDA 5.0 Production Release和显卡是GTX 590.
 
任何帮助将不胜感激.
har*_*ism 23
为了避免出现"Stringly Typed",在CUDA 4.1中的CUDA运行时API函数中不推荐使用字符串来引用设备符号,并在CUDA 5.0中将其删除.
在CUDA 5发布说明如下:
**不再支持使用字符串来表示某些API函数可能出现的设备符号.相反,应该直接使用该符号.
如果您将代码更改为以下代码,它应该可以正常工作.
Status = cudaMemcpyToSymbol(CONSTANT_PARAMETER, &m_dParameter, sizeof(m_dParameter));
ERROR_CHECK(Status);

Rob*_*lla 10
来自CUDA 5.0发行说明:
**不再支持使用字符串来表示某些API函数可能出现的设备符号.相反,应该直接使用该符号."
这些API函数仍然存在,但它们现在仅接受目标符号参数作为裸标识符,而不是裸标识符或命名标识符的字符串文字.例如
__ device__ __ constant__ type ident;
main() { cudaMemcpyToSymbol("ident", ...); } // no longer valid, returns cudaErrorInvalidSymbol
main() { cudaMemcpyToSymbol(ident, ...); }   // valid
所以摆脱这个:
#define PARAMETER "CONSTANT_PARAMETER"
并改变这个:
Status = cudaMemcpyToSymbol(PARAMETER, &m_dParameter, sizeof(m_dParameter)); 
对此:
Status = cudaMemcpyToSymbol(CONSTANT_PARAMETER, &m_dParameter, sizeof(m_dParameter)); 
而且我认为它会起作用.
| 归档时间: | 
 | 
| 查看次数: | 8262 次 | 
| 最近记录: |